【问题标题】:Assigning boolean value to a new column based on conditions根据条件将布尔值分配给新列
【发布时间】:2020-06-16 19:49:48
【问题描述】:

我需要根据名为 X 的列的值(1,2,3,4,5)为新列 Y 中的行分配布尔值。 我在数据集中有此列df

X
1
1
1
3
2
5
2
4
1

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

  • 如果行的 X 值 = 1 则为真
  • 如果行的 X 值 = 2 则为 False
  • 如果行的 X 值 = 3,则为 False
  • 如果行的 X 值 = 4 则为真
  • 如果行的 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().

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

【问题讨论】:

  • stackoverflow.com/questions/19913659/… 向您展示了如何根据多个条件有条件地创建列。但是,在您提供的示例中,这些都不是必需的,因为您的逻辑可以简化为“True 如果 X 为 1 或 4,False 否则”,这是一个简单的df['X'].isin([1, 4])
  • 谢谢。我没有看那个问题。非常有帮助
  • 我将您的评论添加到我的答案中,因为它确实提供了非常有用的简化@ALollz 谢谢!

标签: python pandas


【解决方案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

【讨论】:

  • 非常感谢您的回答,并提供了良好而完整的解释
  • 如果实现代码或问题有任何问题,请随时告诉我:)
猜你喜欢
  • 2021-08-13
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 2017-08-05
  • 2021-09-22
  • 2019-08-25
相关资源
最近更新 更多