Je souhaite créer une nouvelle colonne basée sur deux variables. Je veux que ma nouvelle colonne ait la valeur "Good" si (colonne 1> = .5 ou colonne 2 = 0.5) sinon "Bad".
J'ai essayé d'utiliser lambda
et if
.
TypeError: ("() missing 1 required positional argument: 'y'", 'occurred at index column 1')
Got
df["new column"] = df[["column 1", "column 2"]].apply( lambda x, y: "Good" if (x >= 0.5 or y < 0.5) and (x < 0.5 or y >= 0.5) else "Bad" )
3 Réponses :
Passez plutôt la ligne dans le lambda.
column 1 column 2 column 3 new column 0 1.0 1.0 1 Good 1 2.0 2.0 2 Good 2 0.1 0.7 3 Bad 3 0.1 0.2 4 Good
Exemple:
import pandas as pd df = pd.DataFrame({'column 1': [1, 2, 0.1, 0.1], 'column 2': [1, 2, 0.7, 0.2], 'column 3': [1, 2, 3, 4]}) df['new column'] = df[['column 1', 'column 2']].apply(lambda row: "Good" if (row['column 1'] >= .5 or row['column 2'] < .5) and (row['column 1'] < .5 or row['column 2'] >= .5) else "Bad", axis=1) print(df)
Sortie:
df['new column'] = df[['column 1', 'column 2']].apply(lambda row: "Good" if (row['column 1'] >= .5 or row['column 2'] < .5) and (row['column 1'] < .5 or row['column 2'] >= .5) else "Bad", axis=1)
Essayez ceci:
import pandas as pd def update_column(row): if (row['x'] >= .5 or row['y'] <= .5) and (row['x'] < .5 or row['y'] >= .5): return "Good" return "Bad" df['new_column'] = df.apply(update_column, axis=1)
Pourquoi faire une boucle s'il y a une option vectorisée?
Bien sûr, il existe plusieurs façons de résoudre ce problème.
Mais la boucle est généralement beaucoup plus lente et appliquer est plus rapide qu'une boucle python. Ici, la méthode DataFrame.where est plus rapide et aussi expressive. À plus long terme, il est également avantageux de connaître les outils
Utilisez np.where
, les pandas effectuent un alignement intrinsèque des données, ce qui signifie que vous n'avez pas besoin d'utiliser apply ou d'itérer ligne par ligne, les pandas aligneront les données sur l'index:
%timeit df['new_column'] = df.apply(update_column, axis=1)