我有一个由我的 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)
你能帮我找出错误吗?
只需更正标准内的条件即可。作为第二列“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