在一行中的 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
干杯。
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
干杯。