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

Adi*_*Adi 1 python pandas

我有一个由我的 python 代码读取的 csv,一个数据框是使用 Pandas 创建的。

CSV 文件采用以下格式

1     1.0
2     99.0
3     20.0
7     63
Run Code Online (Sandbox Code Playgroud)

我的代码计算百分位数,并希望找到第二列中值大于 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]
Run Code Online (Sandbox Code Playgroud)

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

NaN     NaN
NaN     NaN
NaN     NaN
NaN     NaN
Run Code Online (Sandbox Code Playgroud)

你能帮我找出错误吗?

Gia*_*nge 6

只需更正标准内的条件即可。作为第二列“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)
Run Code Online (Sandbox Code Playgroud)

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

情况1:

type( df.iloc[:,1]>= 60 )
Run Code Online (Sandbox Code Playgroud)

返回pandas.core.series.Series
所以它给出

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

 #out:
   0   1
1  2  99
3  7  63
Run Code Online (Sandbox Code Playgroud)

案例2:

type( df.iloc[:,1:2]>= 60 )
Run Code Online (Sandbox Code Playgroud)

返回一个 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
Run Code Online (Sandbox Code Playgroud)

因此我认为它改变了索引的处理方式。
永远记住3 是一个标量,而 3:4 是一个数组

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