如何在整个 Pandas 数据框中搜索字符串并获取包含它的列的名称?

Posted

技术标签:

【中文标题】如何在整个 Pandas 数据框中搜索字符串并获取包含它的列的名称?【英文标题】:How to search entire Pandas dataframe for a string and get the name of the column that contains it? 【发布时间】:2019-06-02 16:57:09 【问题描述】:

我想在包含给定字符串的数据框(“类别”)中找到列的名称

categories

    Groceries   Electricity Fastfood    Parking 
0   SHOP        ELCOMPANY   MCDONALDS   park
1   MARKET      ELECT       Subway      car
2   market      electr      Restauran   247 

假设我想在整个数据帧中搜索字符串“MCDO”。 答案应该是“快餐”。我尝试使用 str.contains,但它似乎不适用于数据帧。

我怎样才能做到这一点?谢谢。

【问题讨论】:

【参考方案1】:

如果你可以搜索整个字符串,那就更容易了,

(df == 'MCDONALDS').any().idxmax()

否则使用应用,

df.apply(lambda x: x.str.startswith('MCDO').any()).idxmax()

【讨论】:

我非常喜欢第一个 - 它很短而且效果很好,只显示“Fastfood”而不是早期尝试 lambda 中的“Index(['Fastfood'], dtype='object')”尝试。 第一个函数是什么?你从一个“(”开始 @christfan868,理解代码的最好方法是分解它。 df == 'MCDONALDS' 返回一个布尔值 df,(df == 'MCDONALDS').any() 沿轴 0 返回 True,如果任何值的条件为 True(因此是括号)【参考方案2】:

您可以通过containsany 进行检查

df.apply(lambda x : x.str.contains('MCDO')).any().loc[lambda x : x].index
Index(['Fastfood'], dtype='object')

【讨论】:

大声笑,:-),:D,YW 请注意:df.apply(lambda x : x.str.contains('MCDO')).any().loc[lambda x : x].index.item() 只会返回列名。【参考方案3】:

或使用:

print(df.apply(lambda x: x.str.contains('MCDO')).replace(False,np.nan).dropna(axis=1,how='all').columns.item())

输出:

Fastfood

【讨论】:

【参考方案4】:

也可以为此使用for 循环:

def strfinder(df, mystr):
    for col in df:
        for item in df[col]:
            if mystr in item:
                return col

print(strfinder(df, 'MCDO'))

获取所有可能有字符串的列,例如在下面的修改数据框中:

    Groceries   Electricity  Fastfood    Parking 
0   SHOP        ELCOMPANY   MCDONALDS   park
1   MARKET      MCDON       Subway      car
2   market      electr      Restauran   247 

可以使用“列表理解”:

mystr = 'MCDO'
outlist = [ col 
            for col in df 
            for item in df[col]
            if mystr in item    ]
print(outlist)

输出:

['Electricity', 'Fastfood']

【讨论】:

谢谢,看起来很不错,尽管人们倾向于说在 Pandas 中使用 for 循环总是错误的。但如果它有效,它就会有效。 它们易于理解且速度足以满足大多数目的。但是,如果您的数据很大,则应使用更优化的方法。

以上是关于如何在整个 Pandas 数据框中搜索字符串并获取包含它的列的名称?的主要内容,如果未能解决你的问题,请参考以下文章

在pandas数据框中搜索文本列而不进行循环

Python如何在pandas数据框中提取[]括号内的指定字符串并创建一个具有布尔值的新列

从整个 Python Pandas 数据框中删除美元符号

在pandas数据框中搜索并替换点和逗号

在 pandas 数据框中搜索和替换大型数据集

在 Pandas 数据框中过滤多个列以获取相同的字符串