Строки 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