2017-10-11 82 views
1

我有一個表,看起來像這樣:在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'. 

任何人都可以請幫我可能是一個簡單的黑客?

回答

1

使用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 
+0

'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' –

+0

必須先轉換柱3至數等'DF [ 'col_3'] = DF [ 'col_3']。astype (int)' – jezrael

+0

現在有效。在這種情況下是否有可能在2行中得到結果? 謝謝! –