1
votes

Utilisation de deux variables dans Lambda Python

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"
)


0 commentaires

3 Réponses :


2
votes

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)


0 commentaires

2
votes

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)


3 commentaires

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



5
votes

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)


0 commentaires