Группировать и агрегировать по столбцу pandas со списком в качестве элементов и получать уникальные значения в списке

#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]