Python数据框使用带有2个变量和if else语句的lambda函数分配新列

时间:2018-10-26 14:41:50

标签: python pandas dataframe lambda assign

设置数据框:

import pandas as pd
import numpy as np

np.random.seed(99)

rows = 10

df = pd.DataFrame ({'A' : np.random.choice(range(0, 2), rows, replace = True),
                    'B' : np.random.choice(range(0, 2), rows, replace = True)})

df


   A  B
0  1  1
1  1  1
2  1  0
3  0  1
4  1  1
5  0  1
6  0  1
7  0  0
8  1  1
9  0  1

如果要添加值为'X'的列'C'为df.A和df.B均为0,否则为'Y'。

我尝试过:

df.assign(C = lambda row: 'X' if row.A + row.B == 0 else 'Y')

但这不起作用...

我找到了其他方法来获得结果,但在这种情况下想将.assign与lambda函数一起使用。

关于如何通过lambda工作获得分配的任何建议吗?

3 个答案:

答案 0 :(得分:1)

快到了...

df['C'] = df.apply(lambda row: 'X' if row.A + row.B == 0 else 'Y', axis = 1)

答案 1 :(得分:1)

否,请勿使用lambda

您可以进行矢量化处理

import numpy as np

df['C'] = np.where(df['A'] + df['B'] == 0, 'X', 'Y')

lambda解决方案在这里没有任何好处,但是如果您愿意的话……

df = df.assign(C=np.where(df.pipe(lambda x: x['A'] + x['B'] == 0), 'X', 'Y'))

使用assign + lambda方法:

df = df.assign(C=df.apply(lambda x: 'X' if x.A + x.B == 0 else 'Y', axis=1))

方式的问题是您在Python级循环中迭代行。通常比普通的Python for循环更糟糕。

前两个解决方案在连续的内存块上执行向量化的操作,因此处理效率更高。

答案 2 :(得分:1)

使条件更简单并将其应用于行:

df['C'] = df.apply(lambda row: 'X' if (row.A or row.B) else 'Y', axis = 1)