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