我需要基于名为Y
(X
,1,2,3,4
)的列的值,将布尔值分配给新列5
中的行。
我在数据集df
中有此列:
X
1
1
1
3
2
5
2
4
1
我想要一个新的数据集,它是df副本的新数据集,其中:
所以我应该拥有
X Y
1 true
1 true
1 true
3 false
2 false
5 false
2 false
4 true
1 true
我写了这段代码:
new_df=df.copy()
new_df['Y'] = False
for index in df.iterrows():
if df['X'] == 1:
new_df.iloc[index,9] = True
elif df['X'] == 2:
new_df.iloc[index,9] = False
elif df['X'] == 3:
new_df.iloc[index,9] = False
elif df['X'] == 4:
new_df.iloc[index,9] = True
else:
new_df.iloc[index,9] = False
遇到此错误:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
可以帮我修复代码以获得预期的输出吗?谢谢
答案 0 :(得分:1)
我相信您需要做的是创建一个自定义函数,您可以在其中使用if-elif-else
,然后再使用map
。类似于:
def evaluator(x):
if x == 1:
return True
elif x == 2:
return False
elif x == 3:
return False
elif x == 4:
return True
else:
return False
df['Y'] = df['X'].map(lambda x: evaluator(x))
@Allolz注释提供了有用的简化,它也可以允许对np.where()
使用矢量化运算
df['Y'] = np.where(df['X'].isin([1,4]),True,False)
在您的情况下,并根据您的输入数据框,输出:
X Y
0 1 True
1 1 True
2 1 True
3 3 False
4 2 False
5 5 False
6 2 False
7 4 True
8 1 True