Использование двух переменных в лямбда-питоне

Я хочу сделать новый столбец на основе двух переменных. Я хочу, чтобы у моего нового столбца было значение «Хорошо», если (столбец 1> = .5 или столбец 2 <0,5) и (столбец 1 <.5 или столбец 2> = 0,5) в противном случае «Плохо».

Я пытался использовать lambda и if .

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

Есть

TypeError: ("() missing 1 required positional argument: 'y'", 'occurred at index column 1')

Всего 3 ответа


Попробуй это:

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)


Используйте np.where , pandas выполняет внутреннее выравнивание данных, что означает, что вам не нужно применять или повторять строки за строкой, pandas будет выравнивать данные по индексу:

df['new column'] = df['new column'] = np.where(((df['y'] <= .5) | (df['x'] > .5)) & ((df['x'] < .5) | (df['y'] >= .5)), 'Good', 'Bad')
df

Используя @YunaA. настроить....

import pandas as pd

df = pd.DataFrame({'x': [1, 2, 0.1, 0.1], 
                   'y': [1, 2, 0.7, 0.2], 
                   'column 3': [1, 2, 3, 4]})

df['new column'] = df['new column'] = np.where(((df['y'] <= .5) | (df['x'] > .5)) & ((df['x'] < .5) | (df['y'] >= .5)), 'Good', 'Bad')
df

Выход:

     x    y  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

Тайминги:

import pandas as pd
import numpy as np

np.random.seed(123)
df = pd.DataFrame({'x':np.random.random(100)*2, 
                   'y': np.random.random(100)*1})
def update_column(row):
    if (row['x'] >= .5 or row['y'] <= .5) and (row['x'] < .5 or row['y'] >= .5):
        return "Good"
    return "Bad"  

Результаты

%timeit df['new column'] = np.where(((df['y'] <= .5) | (df['x'] > .5))
& ((df['x'] < .5) | (df['y'] >= .5)), 'Good', 'Bad')

1,45 мс ± 72,9 мкс на цикл (среднее ± стандартное отклонение из 7 циклов, 1000 циклов в каждом)

%timeit df['new_column'] = df.apply(update_column, axis=1)

5,83 мс ± 484 мкс на цикл (среднее ± стандартное отклонение из 7 циклов, по 100 циклов в каждом)


Вместо этого пройдите ряд в лямбду.

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)

Пример:

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)

Выход:

   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

Есть идеи?

10000