在一行中的 2 个数据框列上应用 Lambda

Apply Lambda on 2 dataframe columns in one line

r_c = 'newyork sanfrancisco losangeles'.split()

def my_is_r_c(c):
    return c.replace(' ', '').lower() in r_c

train['is_r_c'] = train['c_o'].apply(lambda x: 1 if my_is_r_c(x) else 0)
train['is_r_c'] = train['c_d'].apply(lambda x: 1 if my_is_r_c(x) else 0)

大家好

有没有办法在一行中为 ['c_o'] 和 ['c_d'] 两列应用 lambda?

提前谢谢

使用df.filter:

df.filter(regex='c_[od]').apply(lambda x: 1 if my_is_r_c(x) else 0)

您可以像这样重写函数:

# use of `isin` allows passing a series
def my_is_rc(c):
    return c.replace(' ','').isin(r_c).astype(int)

# apply along the columns    
train[['is_rc','is_rd']] = train[['c_o','c_d']].apply(my_is_rc)

或者干脆忘记 apply 和:

train[['is_rc','is_rd']] = train[['c_o','c_d']].isin(r_c).astype(int)

您可以像这样使用 applymap 来做到这一点:

df[['is_r_c', 'is_r_d']]= df[['c_o', 'c_d']].applymap(lambda x: 1 if my_is_r_c(x) else 0)

如果您想要合并列,而实际上只有一个结果列,如果您的函数对至少一列的计算结果为 1,则结果列应包含 1,您可以使用类似的小变化来实现这个:

df[['is_r_c']]= df[['c_o', 'c_d']].applymap(lambda x: 1 if my_is_r_c(x) else 0).max(axis='columns')

您可以通过创建两个(而不是您问题中的一个)新列并在列上使用花式索引来实现:

import pandas as pd

train = pd.DataFrame(dict(c_o=[1, 2, 3], c_d=[4, 5, 6]))
train
train[['x_1', 'x_2']] = train[['c_o', 'c_d']].apply(lambda x: x**2)
train

干杯。