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 标准。
我正在尝试满足一项要求,如果超出某个值,我必须将数据框中的值填充为 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 标准。