【问题标题】:Deleting data in pandas given a string condition在给定字符串条件的情况下删除熊猫中的数据
【发布时间】:2018-10-24 11:33:18
【问题描述】:

鉴于以下情况,我无法理解此处的机制。

我有一个 dataframe.csv 读取:

  a1 b1 c1
1 aa bb cc
2 ab ba ca 

df.drop(df['a1'].str.contains('aa',case = False))

我想删除列 a1 中包含 'aa' 的所有行

我相信已经尝试了这里的一切,但仍然得到:

ValueError: 标签 [False False False ... False False False] 不包含在轴中

是的,我也试过了

skipinitialspace=True
axis=1

任何帮助将不胜感激,谢谢。

【问题讨论】:

  • df[~df.a1.str.contains('aa')]

标签: python python-3.x pandas dataframe


【解决方案1】:

str.contains 返回一个掩码:

df['a1'].str.contains('aa',case = False)

1     True
2    False
Name: a1, dtype: bool

但是,drop 接受索引标签,而不是布尔掩码。如果您打开drop 上的帮助,您可能会亲眼目睹这一点:

?df.drop

Signature: df.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
Docstring:
Return new object with labels in requested axis removed.

Parameters
----------
labels : single label or list-like
    Index or column labels to drop.

您可以从掩码中找出索引标签并将 那些 传递给 drop

idx = df.index[df['a1'].str.contains('aa')]
df.drop(idx)

   a1  b1  c1
2  ab  ba  ca

但是,这风太大了,所以我建议只坚持基于条件删除行的 pandaic 方法,布尔索引

df[~df['a1'].str.contains('aa')]

   a1  b1  c1
2  ab  ba  ca

如果有人有兴趣删除列表中包含字符串的行

df = df[~df['a1'].str.contains('|'.join(my_list))]

确保去掉空格。感谢https://stackoverflow.com/a/45681254/9500464

【讨论】:

  • 一个微不足道的速度改进,如果适用的话,是设置regex=False
  • 所以你建议放弃面具,基本上:-)
  • 谢谢你!我仍然很困惑,我真的需要深入回顾一下。
  • @g_altobelli 这很简单,它需要知道索引标签,因为它会删除那些。它不接受布尔掩码,因为它需要接受一个(已经有足够多的索引器可以做到这一点,__getitem__loc 就是其中的两个)。
  • @cᴏʟᴅsᴘᴇᴇᴅ 我刚收到谢谢!现在这更有意义了。我不知道为什么我把这件事弄得这么复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 2021-09-25
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
  • 2018-03-23
相关资源
最近更新 更多