Python 3.x 如何使用关键字从Pandas中的列中删除行
如何删除该行任何列中包含关键字的整行?我有250行和28列,我想使用pandas删除数据帧中任何列中以“income”作为键字符串的所有行,如果df中没有其他NA值,则可以用“income”替换“delete”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
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
谢谢,我正在复习你的答案,并将你的答案标记为正确,我之前忘记了。再次感谢。