繁体   English   中英

根据逻辑运算从熊猫数据框中删除值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM