我有一个由我的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
你能帮我找到错误。
答案 0 :(得分:1)
您的索引有点偏离,因为您只有两列inspect
并且您只想选择索引为[0, 1]
的列。正如1
所述,以下就足够了:
@applesoup
但是,我会考虑命名列,并根据名称进行引用。这样可以避免在criteria = df[df.iloc[:, 1] >= 60.0]
结构发生变化时出现任何错误,例如:
df
答案 1 :(得分:1)
这里的人们似乎更有兴趣提出替代解决方案,而不是深入研究他的代码,以找出真正的错误。我将采取截然相反的策略!
您的代码存在的问题是您正在通过其他DataFrame为DataFrame df
建立索引。为什么?因为您使用slices
而不是整数索引。
df.iloc[:, 1:2] >= 60.0 # Return a DataFrame with one boolean column
df.iloc[:, 1] >= 60.0 # Return a Series
df.iloc[:, [1]] >= 60.0 # Return a DataFrame with one boolean column
使用以下代码更正您的代码:
criteria = df[df.iloc[:, 1] >= 60.0] # Dont slice !
答案 2 :(得分:1)
只需更正标准内的条件即可。作为第二列“1”你应该写df.iloc [:,1] 例如:
type( df.iloc[:,1]>= 60 )
为什么呢? 似乎原因存在于条件的定义类型中。让我们检查一下
案例1:
df[ df.iloc[:,1]>= 60 ]
#out:
0 1
1 2 99
3 7 63
返回 pandas.core.series.Series ,
所以它给出了
type( df.iloc[:,1:2]>= 60 )
情况2:
df[ df.iloc[:,1:2]>= 60 ]
#out:
0 1
0 NaN NaN
1 NaN 99.0
2 NaN NaN
3 NaN 63.0
返回 pandas.core.frame.DataFrame
,并提供
{{1}}
因此我认为它会改变索引的处理方式 请记住, 3是标量,3:4是数组。
如需了解更多信息,请查看官方文档Pandas indexing