[英]Delete values from pandas dataframe based on logical operation
我想从熊猫数据框中删除大于某个阈值的值。 有没有一种有效的方法来执行此操作? 我正在使用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
对df使用布尔掩码 :
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
如果你有多个列,那么上面将无法正常工作,布尔面膜有相匹配的原稿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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.