2017-05-22 139 views
0

我想从熊猫数据框中删除大于特定阈值的值。有没有一种有效的方法来执行此操作?我正在使用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 

如何在没有应用和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 
+0

你现在已经大大改变了你的问题,你想只是简单地覆盖在A列现在? – EdChum

+0

对不起,我不得不更新我的问题来澄清我的观点。是的,我想删除一列中某些值超过特定阈值的某些值。 –

+0

查看我更新的答案的最后一部分 – EdChum

回答

2

使用boolean mask对DF:

In[21]: 
df[df<3] 

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

这里在布尔逻辑条件不满足则返回False,这只会屏蔽掉DF值返回NaN

如果您实际上想要放下这些行然后自行分配:

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 

如果你有多个列,那么上面将无法正常工作,布尔面膜有相匹配的原稿DF,在这种情况下,你可以reindex对原稿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 
+0

我该如何将此应用于特定列?如您所知,df [df.A <3]'只返回第0行和第1行。 –

+0

查看更新的答案 – EdChum