在Pandas/iPython笔记本(Jupyter)的DataFrame /表中的GROUP BY行?
问题描述:
我有一个表,看起来像这样:在Pandas/iPython笔记本(Jupyter)的DataFrame /表中的GROUP BY行?
当前数据帧/表:“original_table”
col_1 col_2 col_3
0 Non-Saved www.google.com 10
1 Non-Saved www.facebook.com 20
2 Non-Saved www.linkedin.com 20
3 Saved www.Quora.com 30
4 Saved www.gmail.com 40
我可以导出表,如下面的使用SQL查询?
col_1 col_2 col_3
0 Non-Saved www.google.com 50
www.facebook.com
www.linkedin.com
1 Saved www.Quora.com 70
www.gmail.com
基本上我期待一个表具有从COL_1 DISTINCT值,从COL_2和SUM(col_3),用于在一排从col_3对应值的所有的对应值。
我的查询:
sql("""SELECT col_1, group_concat(col_2) as col_2, SUM(col_3) as col_3
FROM original_table
GROUP BY col_1
""").show()
我尝试用group_concat使用嵌入的SQL查询,但它给了我下面的错误:
AnalysisException: u"Undefined function: 'GROUP_CONCAT'. This function
is neither a registered temporary function nor a permanent function
registered in the database 'default'.
任何人都可以请帮我可能是一个简单的黑客?
答
使用GroupBy.transform
- 它返回相同的大小Series
为原始组:
#first convert column to numeric
df['col_3'] = df['col_3'].astype(int) #float
df['col_3'] = df.groupby('col_1')['col_3'].transform('sum')
print (df)
col_1 col_2 col_3
0 Non-Saved www.google.com 50
1 Non-Saved www.facebook.com 50
2 Non-Saved www.linkedin.com 50
3 Saved www.Quora.com 70
4 Saved www.gmail.com 70
如果只需要第一个值:
df[['col_1','col_3']] = df[['col_1','col_3']].mask(df['col_1'].duplicated())
print (df)
col_1 col_2 col_3
0 Non-Saved www.google.com 50.0
1 NaN www.facebook.com NaN
2 NaN www.linkedin.com NaN
3 Saved www.Quora.com 70.0
4 NaN www.gmail.com NaN
如果有必要,NaN
s是可以通过空字符串替换 - 中第一个string
列没有问题,但在最后得到混合类型 - 字符串与数字和一些功能应该失败:
df[['col_1','col_3']] = df[['col_1','col_3']].mask(df['col_1'].duplicated()).fillna('')
print (df)
col_1 col_2 col_3
0 Non-Saved www.google.com 50
1 www.facebook.com
2 www.linkedin.com
3 Saved www.Quora.com 70
4 www.gmail.com
print (df['col_3'].apply(type))
0 <class 'float'>
1 <class 'str'>
2 <class 'str'>
3 <class 'float'>
4 <class 'str'>
Name: col_3, dtype: object
'DF [ 'col_3'] = df.groupby( 'COL_1')[ 'col_3']变换( '总和')' 给我: 'COL_1 \t COL_2 \t col_3 \t非保存\t \t www.google.com 102020 \t非保存\t \t www.facebook.com 102020 \t非保存\t \t www.linkedin.com 102 020 \t \t保存www.Quora.com \t \t保存www.gmail.com \t 3040' –
必须先转换柱3至数等'DF [ 'col_3'] = DF [ 'col_3']。astype (int)' – jezrael
现在有效。在这种情况下是否有可能在2行中得到结果? 谢谢! –