1
votes

pandas: obtenir la valeur maximale d'une liste avec des numéros de chaîne

J'ai un dataframe df = pd.DataFrame ({'xx': [['100', '5', '3'], ['5', '40'], ['100' ]]}) et j'aimerais avoir le maximum de chaque liste sous forme de nombre. J'aimerais donc obtenir ceci:

xx
0   100
1   40
2   100

Y a-t-il un moyen de le faire?


0 commentaires

3 Réponses :


1
votes

Convertissez les valeurs en nombres entiers et obtenez la valeur max :

print(df)
    xx
0  100
1   40
2  100

Ou utilisez la compréhension de liste:

df['xx'] = [max(int(y) for y in x) for x in df['xx']]

df['xx'] = df['xx'].map(lambda x: max(int(y) for y in x))


0 commentaires

1
votes

Ajout d'une autre méthode pandas en utilisant series.explode pour décomposer la série de listes en 1 série, puis en utilisant series.astype convertir en int, puis prendre le maximum groupé par index:

0    100
1     40
2    100

df['max_col'] = df['xx'].explode().astype(int).max(level=0)

#or:-> df['xx'].explode().astype(int).groupby(level=0).max()


5 commentaires

c'est super. Cela fonctionne également avec assign df.assign (zz = lambda x: x.xx.explode (). Astype (int) .max (level = 0)) . Merci beaucoup


@ corianne1234 Heureux d'avoir pu aider :)


Encore une question, si vous aviez une liste contenant une valeur non numérique, pourriez-vous simplement définir ceci sur np.nan? peut-être quelque chose avec np.where ()?


@ corianne1234 vous voulez dire avant de trouver max? alors: pd.to_numeric (df ['xx']. explode (), errors = 'coerce'). max (level = ‌ 0) .astype (int) ? si max est un flottant, omettez le astype (int)


parfait, oui. Merci!



0
votes

vous pouvez utiliser pandas.Series. appliquer :

df.assign(max_xx=lambda x: [max(map(int, l)) for l  in x.xx])

sortie:

0    100
1     40
2    100

si vous souhaitez utiliser pandas.DataFrame.assign vous pouvez utiliser:

XXX


6 commentaires

Merci beaucoup. Existe-t-il un moyen de faire cela avec assign? J'ai essayé df.assign (zz = lambda x: max (map (int, x.xx)))


@ corianne1234 oui, vous pouvez utiliser df.assign , si cela vous a été utile, vous pouvez voter pour ou accepter, merci!


J'ai essayé ceci (ci-dessus) mais j'obtiens une erreur TypeError: l'argument int () doit être une chaîne, un objet de type octets ou un nombre, pas une "liste" . Donc ça ne marche pas.


courez-vous de jupyter?


@ corianne1234 si vous exécutez à partir de jupyter vous ne devez exécuter qu'une seule fois la cellule, vous voudrez peut-être redémarrer le noyau


eather vous utilisez df.assign (xx = lambda x: [max (map (int, l)) pour l dans x.xx]) ou df ['xx'] = df [ 'xx']. apply (lambda x: max (map (int, x))) ne les exécutez pas tous les deux, le second changera la colonne df , je recommande de redémarrer le noyau et exécutez df.assign (xx = lambda x: [max (map (int, l)) pour l dans x.xx])