Python dataframe 使用带有 2 个变量的 lambda 函数和 if else 语句分配新列
Python dataframe assign new column using lambda function with 2 variables and if else statement
设置数据框:
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
如果要添加一个列 'C',其值 'X' 是 df.A 且 df.B 均为 0,否则值为 'Y'。
我试过了:
df.assign(C = lambda row: 'X' if row.A + row.B == 0 else 'Y')
但这不起作用...
我找到了其他方法来获得我的结果,但在这种情况下我想使用 .assign
和 lambda 函数。
关于如何使用 lambda 进行分配有什么建议吗?
快到了...
df['C'] = df.apply(lambda row: 'X' if row.A + row.B == 0 else 'Y', axis = 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
循环更糟糕。
前两个解决方案对连续的内存块执行矢量化操作,因此处理效率更高。
创建一个更简单的条件并将其应用于行:
df['C'] = df.apply(lambda row: 'X' if (row.A or row.B) else 'Y', axis = 1)
设置数据框:
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
如果要添加一个列 'C',其值 'X' 是 df.A 且 df.B 均为 0,否则值为 'Y'。
我试过了:
df.assign(C = lambda row: 'X' if row.A + row.B == 0 else 'Y')
但这不起作用...
我找到了其他方法来获得我的结果,但在这种情况下我想使用 .assign
和 lambda 函数。
关于如何使用 lambda 进行分配有什么建议吗?
快到了...
df['C'] = df.apply(lambda row: 'X' if row.A + row.B == 0 else 'Y', axis = 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
循环更糟糕。
前两个解决方案对连续的内存块执行矢量化操作,因此处理效率更高。
创建一个更简单的条件并将其应用于行:
df['C'] = df.apply(lambda row: 'X' if (row.A or row.B) else 'Y', axis = 1)