【问题标题】:Multiple OR conditions using numpy Where使用 numpy Where 的多个 OR 条件
【发布时间】:2021-04-08 09:20:20
【问题描述】:

我正在尝试从其他列实现基于列或某些条件,基本上,如果满足这些条件中的任何一个,结果应该在 NEW 列中为 NO,否则为 YES;即使我使用“或”代替“|”,我怎么会出现大量错误,任何人都可以帮助实现这一点,因为我尝试过的不同方法似乎不起作用

sales["NEW"]=np.where((sales.Status=='Done' | 
                sales.Status=='out' | 
                sales.Status=='in' | 
                sales.sumPaid>dailyAmount | 
                sales.days<14), 'No','Yes')


sales["NEW"]=np.where((sales.Status==('Done|out |in') | sales.sumPaid>dailyAmount |sales.days<14), 'No','Yes')

TypeError Traceback(最近调用 最后的) C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\ops\array_ops.py 在 na_logical_op(x, y, op) 273 # (xint or xbool) and (yint or bool) --> 274 结果 = op(x, y) 275 除了类型错误:

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\ops\rooper.py 在 ror_(左,右) 55 def ror_(左,右): ---> 56 返回 operator.or_(right, left) 57

TypeError: |: 'str' 和 'str' 的操作数类型不受支持

在处理上述异常的过程中,又发生了一个异常:

TypeError Traceback(最近调用 最后的) C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\ops\array_ops.py 在 na_logical_op(x, y, op) 287 尝试: --> 288 结果 = libops.scalar_binop(x, y, op) 289 除外(

pandas_libs\ops.pyx in pandas._libs.ops.scalar_binop()

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\ops\rooper.py 在 ror_(左,右) 55 def ror_(左,右): ---> 56 返回 operator.or_(right, left) 57

TypeError: |: 'bool' 和 'str' 的操作数类型不受支持

在处理上述异常的过程中,又发生了一个异常:

TypeError Traceback(最近调用 最后)在 212 213 销售["新"]=np.where((销售.状态=='完成'| --> 214 销售。状态=='out' | 215 销售。状态=='在' | 216 sales.sumPaid>dailyAmount |

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\ops\common.py 在 new_method(self, other) 中 62 其他 = item_from_zerodim(其他) 63 ---> 64 返回方法(自我,其他) 65 66 返回新方法

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\ops_init_.py 在包装器中(自我,其他) 547 rvalues = extract_array(其他,extract_numpy=True) 548 --> 549 res_values = logical_op(左值,右值,操作) 第550章 551

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\ops\array_ops.py 在logical_op(左,右,op) 第364章 365 --> 366 res_values = na_logical_op(左值,右值,操作) 第367章 368

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\ops\array_ops.py 在 na_logical_op(x, y, op) 296 类型 = 类型(y)。名称 第297章 --> 298 f“无法使用 dtyped [{x.dtype}] 数组执行 '{op.name}'” 第299章 300)

TypeError: 无法使用 dtyped [object] 数组执行 'ror_' 和 [bool] 类型的标量

【问题讨论】:

  • 使用括号(sales.Status=='Done') | (sales.Status=='out') | ...
  • 旁白:避免将列引用为带有句点的属性。请参阅attribute access 下的警告。始终使用[] 访问列(即sales["Status"])。

标签: python pandas numpy


【解决方案1】:

你提到的第二种方式是不正确的,它不会通过把 |在字符串中。

第一种方法可以通过括号来解决:

sales["NEW"]=np.where(((sales.Status=='Done') | 
                (sales.Status=='out') | 
                (sales.Status=='in') | 
                (sales.sumPaid>dailyAmount) | 
                (sales.days<14)), 'No','Yes')

【讨论】:

  • 它实际上在我当前版本的 numpy 中工作,可能不适用于最新版本。 | 无论如何是最好的出路。谢谢@QuangHoang
【解决方案2】:

要结合考虑DataFrame.isin,其中每个条件都包含在成对的括号中。下面通过[]访问列,并使用数学运算符的函数形式,例如Series.gtSeries.lt

sales["NEW"] = np.where((sales["Status"].isin(['Done','out','in'])) | 
                        (sales["sumPaid"].gt(dailyAmount)) |
                        (sales["days"].lt(14)), 
                        'No',
                        'Yes')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多