我想从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
答案 0 :(得分:2)
对df:
使用boolean maskIn[21]:
df[df<3]
Out[21]:
A
0 1.0
1 2.0
2 NaN
3 NaN
4 NaN
这里不符合布尔条件,返回False
,这只会掩盖返回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
如果你有多列,那么上面的工作就不会起作用,因为布尔掩码必须匹配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