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

2024-10-06 19:20:59 发布

您现在位置:Python中文网/ 问答频道 /正文

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)

嗨,伙计们

是否有一种方法可以将lambda应用于两列['c_o']和['c_d'],只在一行中

提前thx


Tags: lambdareturnifismydeftrainlower
3条回答

您可以像这样重写函数:

# 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')

使用df.filter

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

相关问题 更多 >