Python 检查数据框中的特定条件

Python to check for a particular condition in a dataframe

我正在尝试满足一项要求,如果超出某个值,我必须将数据框中的值填充为 NaN。

    s={'2018':[1,2,3,4],'2019':[2,3,4,5],'2020':[4,6,8,9],'2021':[11,12,34,42], 'qty':[45,22,12,42],'price':[22,33,44,55]}
    p=pd.DataFrame(data=s)
    k=(p.qty+p.price) # Not sure if this is the right way as per the requirement.

条件是如果2018或19或20或21列的值大于k,则填入NaN。

假设 k=3,则 2018 年第四行的值为 4 将为 NaN。 所有列的 k 值都不同,因此需要逐列计算,因此值必须为 NaN。

我怎样才能做到这一点?

其实很简单。您需要了解更多有关 pandas 数据帧中的逻辑语句的信息。要解决您的问题,您可以尝试以下代码:

s={'2018':[1,2,3,4],'2019':[2,3,4,5],'2020':[4,6,8,9],'2021':[11,12,34,42], 'qty':[45,22,12,42],'price':[22,33,44,55]}
p=pd.DataFrame(data=s)
k = 4
p[p<k]

输出

2018 2019 2020 2021 qty price
0 nan nan 4 11 45 22
1 nan nan 6 12 22 33
2 nan 4 8 34 12 44
3 4 5 9 42 42 55

请注意 k = (p.qty+p.price) 将 return 一个 numpy 数组,而不是标量值。

一旦你弄清楚 k = (p.qty+p.price) 是什么,你就可以更新它。但是,我认为您要解决此问题的方法是逐列使用 gt() 运算符。这是我的解决方案。

    import pandas as pd
    s={'2018':[1,2,3,4],'2019':[2,3,4,5],'2020':[4,6,8,9],'2021': [11,12,34,42], 'qty':[1,2,3,4], 'price':[1,2,3,4]}
    p=pd.DataFrame(data=s)
    k = (p.qty * p.price)
    needed = p[['qty', 'price']]
    p = p.where(p.gt(k, axis=0), None)
    p[['qty','price']] = needed
    print(p)

此输出:

   2018  2019  2020  2021  qty  price
0   NaN   2.0   4.0    11    1      1
1   NaN   NaN   6.0    12    2      2
2   NaN   NaN   NaN    34    3      3
3   NaN   NaN   NaN    42    4      4

一些注意事项。我保存并 re-add 最后一列。但是,如果您不需要这些,您可以删除带有 needed 一词的行。包含大部分代码的行是 p = p.where(p.gt(k, axis=0), None)。在当前示例中,我的比较是在列级别上进行的。因此,'2019':2、3、4、5 与 k:1、4、9、16 进行比较。显示 2 > 1,但 3、4、5 均小于 4、9、16,导致 True、False、False、False。 DataFrame.where(cond, other) 将 False 值替换为 None,这是 python 的 null 标准。