pandas数据框架为:
df = pd.DataFrame([['A', 1, 20], ['A', 2, 30], ['B', 1, 50], ['B', 3, 45], ['A', 4, 60], ['B', 5, 70]])
df.columns = ['Type', 'P', 'X']
p>Type P X
0 A 1 20
1 A 2 30
2 B 1 50
3 B 3 45
4 A 4 60
5 B 5 70
期望:
我想应用嵌套条件来计算一个值,并将其作为新列追加。
我是这样做的:
result = 0
if (df.Type == 'A'):
if df.P % 2 == 0:
result = df.X+10
else:
restult = df.X+20
else:
if df.P % 2 == 0:
result = df.X+30
else:
result = df.X+40
df['Result'] = result
期望输出为:
Type P X Result
0 A 1 20 40
1 A 2 30 40
2 B 1 50 90
3 B 3 45 85
4 A 4 60 70
5 B 5 70 110
但是它失败了,错误:ValueError: Series的真值是模棱两可的。使用a.empty a.bool (), a.item (), a.any()或所有()。
我已经挖了其他的线程,但他们似乎是其他问题。
欢迎提出任何建议
使用np.select(listof conditions, listofchoices, alternative)
condition=[(df.Type == 'A')&(df.P % 2 != 0),(df.Type == 'A')&(df.P % 2 == 0), (df.Type == 'B')&(df.P % 2 == 0)]
choices= [df.X+20,df.X+10,df.X+30]
df['result'] = np.select(condition, choices,df.X+40)
Type P X result
0 A 1 20 40
1 A 2 30 40
2 B 1 50 90
3 B 3 45 85
4 A 4 60 70
5 B 5 70 110
if
算子不是矢量化的,不能与Series一起使用,用np.select
代替:
type_a, p_even = df.Type == 'A', df.P % 2 == 0
amount = np.select(
[type_a & p_even, type_a & ~p_even, ~type_a & p_even, ~type_a & ~p_even],
[10, 20, 30, 40]
)
df['Result'] = df.X + amount
df
Type P X Result
0 A 1 20 40
1 A 2 30 40
2 B 1 50 90
3 B 3 45 85
4 A 4 60 70
5 B 5 70 110