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

Ren*_*ene 5 python lambda dataframe assign pandas

设置数据框:

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
Run Code Online (Sandbox Code Playgroud)

我想添加一列“C”,其值“X”为 df.A 和 df.B 均为 0,其他值为“Y”。

我试过:

df.assign(C = lambda row: 'X' if row.A + row.B == 0 else 'Y')
Run Code Online (Sandbox Code Playgroud)

但这不起作用......

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

关于如何使用 lambda 进行分配有什么建议吗?

jpp*_*jpp 7

不,不要使用lambda

您可以将其矢量化:

import numpy as np

df['C'] = np.where(df['A'] + df['B'] == 0, 'X', 'Y')
Run Code Online (Sandbox Code Playgroud)

lambda解决方案在这里没有任何好处,但如果你想要它......

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

使用+的错误方法:assignlambda

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

糟糕的方法的问题在于你在 Python 级别的循环中迭代行。它通常比常规的 Python循环更糟糕for

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