根据条件将布尔值分配给新列

时间:2020-06-16 19:49:48

标签: python pandas

我需要基于名为YX1,2,3,4)的列的值,将布尔值分配给新列5中的行。 我在数据集df中有此列:

X
1
1
1
3
2
5
2
4
1

我想要一个新的数据集,它是df副本的新数据集,其中:

  • 如果行的X值= 1,则为True
  • 如果行的X值= 2,则为False
  • 如果行的X值= 3,则为False
  • 如果行的X值= 4,则为True
  • 如果行的X值= 5,则为False

所以我应该拥有

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().

可以帮我修复代码以获得预期的输出吗?谢谢

1 个答案:

答案 0 :(得分:1)

编辑:np.where()优于map()

我相信您需要做的是创建一个自定义函数,您可以在其中使用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