过滤其值小于0的pandas数据帧行

时间:2015-12-12 18:05:49

标签: python pandas

我有像这样的pandas数据框

df = pd.DataFrame(data=[[21, 1],[32, -4],[-4, 14],[3, 17],[-7,NaN]], columns=['a', 'b'])
df

我希望能够删除列列表中的负值并使用NaN保存行。

在我的示例中,只有2列,但我的数据集中有更多列,因此我无法逐一执行此操作。

3 个答案:

答案 0 :(得分:12)

如果您要将其应用于所有列,请df[df > 0]dropna()一起使用:

>>> df[df > 0].dropna()
    a   b
0  21   1
3   3  17

如果你知道要应用它的列,那么只针对那些df[df[cols] > 0]的列:

>>> cols = ['b']
>>> df[cols] = df[df[cols] > 0][cols]
>>> df.dropna()
    a   b
0  21   1
2  -4  14
3   3  17

答案 1 :(得分:0)

我发现您可以通过执行以下操作来简化答案:

>>> cols = ['b']
>>> df = df[df[cols] > 0]

dropna()不是就地方法,因此您必须存储结果。

>>> df = df.dropna()

答案 2 :(得分:0)

我一直在寻找一个不会改变dtype的解决方案(如果使用dropna的答案中建议将NaN与int混合使用,则会发生这种情况。由于发问者已经在其中他们的数据,这对他们来说可能不是问题。我采用了保留int64 dtype的解决方案,下面是我的示例数据:

df = pd.DataFrame(data={'a':[0, 1, 2], 'b': [-1,0,1], 'c': [-2, -1, 0]})
columns = ['b', 'c']
filter_ = (df[columns] >= 0).all(axis=1)
df[filter_]


   a  b  c
2  2  1  0