【问题标题】:使用 numpy 数组检查多个条件
【发布时间】:2022-01-23 16:06:01
【问题描述】:

我有一个包含几行和多列的数据框,我已将其转换为一个 numpy 数组以加快计算速度。 Dataframe 的前五列如下所示:

par1      par2      par3      par4      par5
1.502366  2.425301  0.990374  1.404174  1.929536
1.330468  1.460574  0.917349  1.172675  0.766603 
1.212440  1.457865  0.947623  1.235930  0.890041 
1.222362  1.348485  0.963692  1.241781  0.892205 
...

这些列现在存储在一个 numpy 数组 a = df.values

我需要检查五列中的至少两列是否满足条件(即它们的值大于某个阈值)。最初,我编写了一个直接在数据帧上执行操作的函数。但是,由于我的数据量非常大,需要一遍又一遍地重复计算,所以我切换到 numpy 以利用矢量化。

检查我想使用的条件

df['Result'] = np.where(condition_on_parameters > 2, True, False)

但是,我无法弄清楚如何编写 condition_on_parameters 以便在 5 个参数中至少有 2 个大于阈值时返回 True 或 False。我想在condition_on_parameters 上使用sum() 函数,但我不确定如何编写这样的条件。

编辑 指定每个参数的阈值不同是很重要的。例如thr1=1.2, thr2=2.0, thr3=1.5, thr4=2.2, thr5=3.0。所以我需要检查 par1 > thr1, par2 > thr2, ..., par5 > thr5。

【问题讨论】:

  • 它是df.values,没有()。转换为 numpy 不会加快计算速度,dataframe 在底层已经是 np.arraydf.gt(.5).sum(1).ge(2) 为阈值 .5 做你想做的事。
  • 哇!来这里回答,但我正在学习新东西...... SO
  • 这很好,但它可以在多种条件下工作吗?例如 par1 > 0.5、par2 > 1.2、par3 > 3 等。在这种情况下,我需要在每一列上指定条件,然后求和并检查它何时大于或等于 2。
  • @user12394113 - 如果您有其他要求,请更新您的问题。如果您提供带有示例条件和预期输出的最小输入示例,将会有所帮助。你可以利用广播df.gt([.5,.3,.2,.5,.8]).sum(1).ge(2)
  • @MichaelSzczesny:天才!

标签: python pandas numpy


【解决方案1】:

假设condition_on_parameters 返回一个与a 大小相同且条目为TrueFalse 的数组,您可以使用np.sum(condition_on_parameters, axis=1) 对真值求和(True 的数值为1 ) 的每一行。这提供了一个一维数组,其中条目作为满足条件的列数。然后可以将此数组与where 一起使用以获取您要查找的行号。

df['result'] = np.where(np.sum(condition_on_parameters, axis=1) > 2)

【讨论】:

    【解决方案2】:

    您可以利用 pandas 的功能吗?例如,您可以使用.apply 然后.sum(axis=1) 有效地检查多行/列的条件。

    这里有一些示例代码:

    import pandas as pd
    df = pd.DataFrame([[1.50, 2.42, 0.88], [0.98,1.3, 0.56]], columns=['par1', 'par2', 'par3'])
    
    # custom_condition, e.g. value less or equal than threshold
    def leq(x, t):
         return x<=t
    
    condition = df.apply(lambda x: leq(x, 1)).sum(axis=1)
    # filter
    df.loc[condition >=2]
    

    我认为这在效率方面应该等同于 numpy,因为 pandas 最终建立在此之上,但我并不完全确定...

    【讨论】:

      【解决方案3】:

      您似乎在寻找numpy.any

      a = np.array(\
      [[1.502366,  2.425301,  0.990374,  1.404174,  1.929536],
      [1.330468,  1.460574,  0.917349,  1.172675,  0.766603 ],
      [1.212440,  1.457865,  0.947623,  1.235930,  0.890041 ],
      [1.222362,  1.348485,  0.963692,  1.241781,  0.892205 ]]);
      df = pd.DataFrame(a, columns=[f'par{i}' for i in range(1, 6)])
      df['Result'] = np.any(df > 1.46, axis=1) # append the result column
      

      给出以下数据框

      【讨论】:

        猜你喜欢
        • 2021-04-22
        • 1970-01-01
        • 2016-01-27
        • 2017-07-06
        • 1970-01-01
        • 2023-01-02
        • 1970-01-01
        • 2021-06-17
        • 1970-01-01
        相关资源
        最近更新 更多