在Python中,如何使用特定字符串过滤出多个列

在Python中,如何使用特定字符串过滤出多个列,python,pandas,Python,Pandas,我是python新手,尤其是熊猫,所以我真的不知道自己在做什么。我有10列100000行和4个字母字符串。我需要过滤掉所有列/行中不包含“DDD”的行 我试着用iloc和loc来做,但不起作用: 将熊猫作为pd导入 df=pd.read\u csv(“data\u 3.csv”,分隔符='!')) df.iloc[:,10:20].str.contains('DDD',regex=False,na=False) df.head() 它返回一个错误:“DataFrame”对象没有可以使用的属性“

我是python新手,尤其是熊猫,所以我真的不知道自己在做什么。我有10列100000行和4个字母字符串。我需要过滤掉所有列/行中不包含“DDD”的行

我试着用iloc和loc来做,但不起作用:

将熊猫作为pd导入
df=pd.read\u csv(“data\u 3.csv”,分隔符='!'))
df.iloc[:,10:20].str.contains('DDD',regex=False,na=False)
df.head()
它返回一个错误:“DataFrame”对象没有可以使用的属性“str”

,但只能在序列上使用,不能在DataFrames上使用。因此,为了使用它,我们逐个查看每一列(这是一个系列),查看它们的循环:

>>将熊猫作为pd导入
>>>df=pd.DataFrame([['DDDA','DDDB','DDDC','dddddd'],
['DDDE','DDDF','DDDG','DHDD'],
['DDDI','DDDJ','DDDK','DDDL'],
['DMDD','DNDN','DDOD','DDDP']],
列=['A'、'B'、'C'、'D'])
>>>对于df.columns中的列:
df=df[df[column].str.contains('DDD')]
在for循环中,我们使用
df
覆盖数据帧
df
,其中列包含“DDD”。通过在每一列上循环,我们将删除该列中不包含“DDD”的行,直到我们查看了所有列,只在每一列中保留包含“DDD”的行

这将为您提供:

打印(df) A、B、C、D 0 DDDA DDDB DDDC DDDD 2 DDDI DDDJ DDDK DDDL 由于您只在10列上循环,因此速度不应该太慢



编辑:您可能应该在不使用for循环的情况下进行操作,正如所解释的,因为它可能会更快,但我将把它保留下来,因为在不了解lambda函数的情况下更容易理解。

我建议在不使用
for
循环的情况下进行操作,如下所示:

df[df.apply(lambda x: x.str.contains('DDD')).all(axis=1)]
仅选择字符串列的步骤

df[df.select_dtypes(include='object').apply(lambda x: x.str.contains('DDD')).all(axis=1)]
selected_cols = ['A','B']
df[df[selected_cols].apply(lambda x: x.str.contains('DDD')).all(axis=1)]
仅选择某些字符串列的步骤

df[df.select_dtypes(include='object').apply(lambda x: x.str.contains('DDD')).all(axis=1)]
selected_cols = ['A','B']
df[df[selected_cols].apply(lambda x: x.str.contains('DDD')).all(axis=1)]

您可以这样做,但如果您的所有列类型都是StringType:

for column in foo.columns:
    df = df[~df[c].str.contains('DDD')]

我还有另外10列,其中包含各种值,我认为通过使用df.drop删除它们不会引起任何问题,但事实并非如此。我是否可以仅应用于带字符串的那10列?它只返回列名,不返回值,如果在末尾添加
df
,它将返回原始的未修改的数据帧您可以检查数据类型?检查它们是否是对象?它在下面的@Aris示例帧上测试得很好。此外,如果您想添加df,这不会修改您的原始df=