Pandas/iPython 笔记本(Jupyter)中 DataFrame/table 中的 GROUP BY 行?

GROUP BY rows in DataFrame/table in Pandas/iPython notebook (Jupyter)?

我有一个 table 看起来像这样:

当前 DataFrame/Table:'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 查询导出如下 table 吗?

    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    

基本上我期望 table 具有来自 col_1 的 DISTINCT 值,来自 col_2 的所有对应值和来自 [= 的对应值的 SUM(col_3) 35=] 一排。

我的查询:

 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 - 它 return 与原始组 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

如有必要,NaNs 可以替换为空字符串 - 在第一个 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