Python 3.x 如何使用关键字从Pandas中的列中删除行

Python 3.x 如何使用关键字从Pandas中的列中删除行,python-3.x,pandas,row,dataframe,multiple-columns,Python 3.x,Pandas,Row,Dataframe,Multiple Columns,如何删除该行任何列中包含关键字的整行?我有250行和28列,我想使用pandas删除数据帧中任何列中以“income”作为键字符串的所有行,如果df中没有其他NA值,则可以用“income”替换“delete” df[df.applymap(lambda x: False if 'DELETE' in str(x) else True)].dropna() 例如,假设您想要删除列中包含“c”的任何行 In [5]: import pandas as pd In [7]: data = [['a

如何删除该行任何列中包含关键字的整行?我有250行和28列,我想使用pandas删除数据帧中任何列中以“income”作为键字符串的所有行,如果df中没有其他NA值,则可以用“income”替换“delete”

df[df.applymap(lambda x: False if 'DELETE' in str(x) else True)].dropna()

例如,假设您想要删除列中包含“c”的任何行

In [5]: import pandas as pd
In [7]: data = [['a', 'b'], ['a', 'c'], ['c', 'd']]
        df = pd.DataFrame(data, columns=['col1', 'col2'])

In [9]: df
Out[9]:
  col1 col2
0    a    b
1    a    c
2    c    d

In [10]: df.loc[~(df == 'c').sum(axis=1).astype(bool)]
Out[10]:
  col1 col2
0    a    b
比较此问题的不同解决方案。我首先创建了一个大型测试数据集:

In [11]: data = [['a', 'b'], ['a', 'c'], ['c', 'd']]*10000
         df = pd.DataFrame(data, columns=['col1', 'col2'])
这是一个更新的解决方案,我认为是迄今为止最好的:

In [6]: %timeit df.loc[~(df == 'c').any(axis=1)]
100 loops, best of 3: 3.85 ms per loop
以下是我最初的解决方案:

In [13]: %timeit df.loc[~(df == 'c').sum(axis=1).astype(bool)]
100 loops, best of 3: 3.92 ms per loop
以下是与其他解决方案的比较:

In [14]: %timeit df[df.applymap(lambda x: False if 'c' in str(x) else True)].dropna()
10 loops, best of 3: 43 ms per loop

In [5]: %timeit df[~df.apply(lambda series: series.str.contains('c')).any(axis=1)]
10 loops, best of 3: 60.7 ms per loop

虽然最初的问题相对简单,但它也说明了lambdas可能非常慢。多次调用函数会带来很高的开销,例如,如果数据帧中有很多行。在处理大型数据帧时,避免它们通常是值得的。

您可以使用
apply
和lambda表达式来检查每列中的目标字。然后使用
any(axis=1)
查找包含该单词的任何行。最后,使用带有tilda(
~
)的布尔索引来定位收入不在行中的所有行

df = pd.DataFrame({'A': ['a', 'income', 'c'], 'B': ['a', 'b', 'income'], 'C': ['a', 'b', 'c']})

>>> df
        A       B  C
0       a       a  a
1  income       b  b
2       c  income  c

# A check for which cells contain the target word.
>>> df.apply(lambda series: series.str.contains('income'))
       A      B      C
0  False  False  False
1   True  False  False
2  False   True  False

# Remove the offending rows.
>>> df[~df.apply(lambda series: series.str.contains('income')).any(axis=1)]
   A  B  C
0  a  a  a

谢谢,我正在复习你的答案,并将你的答案标记为正确,我之前忘记了。再次感谢。