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]
3 Réponses :
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()
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]]})
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]