【问题标题】:Delete values from pandas dataframe based on logical operation根据逻辑操作从熊猫数据框中删除值
【发布时间】:2017-05-22 15:07:37
【问题描述】:

我想从 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

【问题讨论】:

  • 您现在已经大大改变了您的问题,您现在只想覆盖 A 列吗?
  • 抱歉,我不得不更新我的问题以澄清我的观点。是的,我想删除某一列中高于特定阈值的一些值。
  • 查看我更新答案的最后一部分
  • 这很棒。谢谢

标签: python pandas dataframe


【解决方案1】:

对 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

【讨论】:

  • 我怎样才能将它应用到特定的列?如您所知,df[df.A &lt; 3] 仅返回第 0 行和第 1 行。
猜你喜欢
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
  • 2018-01-09
  • 2013-07-02
  • 1970-01-01
相关资源
最近更新 更多