如何选择数据框中大于给定值的所有元素

新手上路,请多包涵

我有一个由我的 python 代码读取的 csv,并且使用 pandas 创建了一个数据框。

CSV 文件格式如下

1     1.0
2     99.0
3     20.0
7     63

我的代码计算百分位数并希望找到第二列中的值大于 60 的所有行。

 df = pd.read_csv(io.BytesIO(body), error_bad_lines=False, header=None, encoding='latin1', sep=',')

percentile = df.iloc[:, 1:2].quantile(0.99)  # Selecting 2nd column and calculating percentile

criteria = df[df.iloc[:, 1:2] >= 60.0]

虽然我的百分位数代码工作正常,但查找第 2 列的值大于 60 的所有行的条件返回

NaN     NaN
NaN     NaN
NaN     NaN
NaN     NaN

你能帮我找出错误吗?

原文由 Adi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 605
2 个回答

只需更正标准内的条件即可。作为第二列“1”,您应该编写 df.iloc[:,1]。

例子:

 import pandas as pd
import numpy as np
b =np.array([[1,2,3,7], [1,99,20,63] ])

df = pd.DataFrame(b.T) #just creating the dataframe

criteria = df[ df.iloc[:,1]>= 60 ]
print(criteria)

为什么?原因似乎存在于条件的定义类型中。让我们检查一下

情况1:

 type( df.iloc[:,1]>= 60 )

返回 pandas.core.series.Series

所以它给了

 df[ df.iloc[:,1]>= 60 ]

 #out:
   0   1
1  2  99
3  7  63

案例2:

 type( df.iloc[:,1:2]>= 60 )

返回一个 pandas.core.frame.DataFrame

,并给出

df[ df.iloc[:,1:2]>= 60 ]

#out:
    0     1
0 NaN   NaN
1 NaN  99.0
2 NaN   NaN
3 NaN  63.0

因此我认为它改变了索引的处理方式。

永远记住 3 是一个标量,而 3:4 是一个数组

有关更多信息,最好查看官方文档 Pandas indexing

原文由 GianAnge 发布,翻译遵循 CC BY-SA 4.0 许可协议

您的索引有点偏离,因为您只有两列 [0, 1] 并且您有兴趣只选择索引为 1 的列。正如 @applesoup 提到的以下内容就足够了:

 criteria = df[df.iloc[:, 1] >= 60.0]

但是,我会考虑命名列并仅根据名称进行引用。这将使您避免在 df 结构发生变化时出现任何错误,例如:

 import pandas as pd

df = pd.DataFrame({'a': [1, 2, 3, 7], 'b': [1.0, 99.0, 20.0, 63.]})

criteria = df[df['b'] >= 60.0]

原文由 An economist 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题