Строки GROUP BY в DataFrame/ таблице в записной книжке Pandas/iPython (Jupyter)?

У меня есть таблица, которая выглядит так:

Текущий 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?

    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    

В основном я ожидаю, что таблица будет иметь значения DISTINCT из col_1, все соответствующие значения из 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()

Я попытался с помощью встроенного запроса SQL с помощью group_concat, но он дает мне следующую ошибку:

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
Другие вопросы по тегам