2
votes

Regrouper et agréger sur une colonne pandas avec liste comme éléments, et obtenir des valeurs uniques dans la liste

J'ai le dataframe suivant

new_df = df.groupby(["id"]).agg({"values": lambda val: set(val)}).reset_index()

TypeError: unhashable type: 'list'

Je veux obtenir ce qui suit après l'étape de groupby et d'agrégation

id  values
1   [111, 121, 131, 191]
2   [211, 221, 281]
3   [301, 321]

J'utilise ce qui suit, mais cela me donne une erreur -

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]


0 commentaires

3 Réponses :


3
votes

Une façon de le faire -

    id  values
0   1   [191, 131, 121, 111]
1   2   [221, 211, 281]
2   3   [301, 321]

Production

df.groupby('id')['values'].sum().apply(lambda x: list(set(x))).reset_index()


0 commentaires

2
votes

Cela devrait fonctionner

reproduisez votre exemple:

    values
id  
1   {121, 131, 191, 111}
2   {281, 211, 221}
3   {321, 301}

Résoudre la question

df = df.groupby(by='id').sum()
df[['values']] = df[['values']].applymap(lambda x: set(x))

Le résultat

import pandas as pd

df = pd.DataFrame({'id': [1, 2, 1, 3], 'values': [[111, 121, 131], [211, 221, 281], [111, 191], [301, 321]]})


0 commentaires

1
votes

Vous pouvez utiliser df.explode puis utiliser GroupBy.unique ici.

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]


0 commentaires