#python #pandas #performance #dataframe #pandas-groupby
#python #pandas #Производительность #фрейм данных #pandas-groupby
Вопрос:
У меня есть следующий фрейм данных
df = pd.DataFrame(
{
"id": [1, 2, 1, 3],
"values": [[111, 121, 131], [211, 221, 281], [111, 191], [301, 321]],
}
)
# df
id values
1 [111, 121, 131]
2 [211, 221, 281]
1 [111, 191]
3 [301, 321]
Я хочу получить следующее после groupby и шага агрегирования
id values
1 [111, 121, 131, 191]
2 [211, 221, 281]
3 [301, 321]
Я использую следующее, но это выдает ошибку —
new_df = df.groupby(["id"]).agg({"values": lambda val: set(val)}).reset_index()
TypeError: unhashable type: 'list'
Ответ №1:
Один из способов сделать это —
df.groupby('id')['values'].sum().apply(lambda x: list(set(x))).reset_index()
Вывод
id values
0 1 [191, 131, 121, 111]
1 2 [221, 211, 281]
2 3 [301, 321]
Ответ №2:
Это должно сработать
повторите свой пример:
import pandas as pd
df = pd.DataFrame({'id': [1, 2, 1, 3], 'values': [[111, 121, 131], [211, 221, 281], [111, 191], [301, 321]]})
Решить вопрос
df = df.groupby(by='id').sum()
df[['values']] = df[['values']].applymap(lambda x: set(x))
Вывод
values
id
1 {121, 131, 191, 111}
2 {281, 211, 221}
3 {321, 301}
Ответ №3:
Вы можете использовать df.explode
, а затем использовать GroupBy.unique
здесь.
df.explode('values').groupby('id')['values'].unique().reset_index()
id values
0 1 [191, 131, 121, 111]
1 2 [221, 211, 281]
2 3 [301, 321]