根据逻辑操作从pandas数据帧中删除值

时间:2017-05-22 15:07:37

标签: python pandas dataframe

我想从pandas数据框中删除大于某个阈值的值。有没有一种有效的方法来执行此操作?我正在使用apply和lambda,它工作正常,但对于大型数据帧来说有点慢,我觉得必须有更好的方法。

df = pd.DataFrame({'A': [1,2,3,4,5], 'B': [1,2,3,4,5]})
df

    A   B
0   1   1
1   2   2
2   3   3
3   4   4
4   5   5

如果没有apply和lambda,怎么办呢?

df['A'] = df.apply(lambda x: x['A'] if x['A'] < 3 else None, axis=1)
df


    A    B
0   1.0  1
1   2.0  2
2   NaN  3
3   NaN  4
4   NaN  5

1 个答案:

答案 0 :(得分:2)

对df:

使用boolean mask
In[21]:
df[df<3]

Out[21]: 
     A
0  1.0
1  2.0
2  NaN
3  NaN
4  NaN

这里不符合布尔条件,返回False,这只会掩盖返回NaN

的df值

如果您确实要删除这些行,请自行分配:

df = df[df<3]

比较特定列:

In[22]:
df[df['A']<3]

Out[22]: 
   A
0  1
1  2

如果你想要删除行中的NaN,那么你可以使用一个技巧,其中双方括号将返回单个列df,这样我们就可以掩盖df:

In[25]:
df[df[['A']]<3]

Out[25]: 
     A
0  1.0
1  2.0
2  NaN
3  NaN
4  NaN

如果你有多列,那么上面的工作就不会起作用,因为布尔掩码必须匹配orig df,在这种情况下你可以reindex对着orig df索引:

In[31]:
df = pd.DataFrame({'A': [1,2,3,4,5], 'B': [1,2,3,4,5]})
df[df['A']<3].reindex(df.index)

Out[31]: 
     A    B
0  1.0  1.0
1  2.0  2.0
2  NaN  NaN
3  NaN  NaN
4  NaN  NaN

修改

如果您只想覆盖单一栏目,您已经再次更新了问题:

In[32]:
df = pd.DataFrame({'A': [1,2,3,4,5], 'B': [1,2,3,4,5]})
df['A'] = df.loc[df['A'] < 3,'A']
df

Out[32]: 
     A  B
0  1.0  1
1  2.0  2
2  NaN  3
3  NaN  4
4  NaN  5