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

时间:2018-06-14 21:09:40

标签: python pandas

我有一个由我的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

你能帮我找到错误。

3 个答案:

答案 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