【问题标题】:Search a string in each row of a pandas Dataframe and return the column names where found在 pandas Dataframe 的每一行中搜索一个字符串并返回找到的列名
【发布时间】:2019-07-19 15:38:35
【问题描述】:

有没有办法在 DataFrame 中找到一个字符串并在匹配时返回列名。

在下面的示例中,我试图查找出现“SRC”的列,不确定我是否接近,但它返回所有列名,而不仅仅是相关的列名。我确定我在做一些傻事。

df = pd.DataFrame({'col1':['foo SRC','bar','baz'], 'col2':['foo','bar','baz'],'col3':['SRC','bar','SRC'],
                  'col4':['SRC','SRC','SRC']})

df['col_list']= '/'.join(df.apply(lambda x : x.str.contains('SRC')).any().loc[lambda x : x].index)


Actual Result:
---------------------------------------------
col1    |col2   |col3   |col4   |col_list
--------|-------|-------|-------|----------------
foo SRC |foo    |SRC    |SRC    |col1/col3/col4
bar     |bar    |bar    |SRC    |col1/col3/col4
baz     |baz    |SRC    |SRC    |col1/col3/col4

Expected:

col1    |col2   |col3   |col4   |col_list
--------|-------|-------|-------|----------------
foo SRC |foo    |SRC    |SRC    |col1/col3/col4
bar     |bar    |bar    |SRC    |col4
baz     |baz    |SRC    |SRC    |col3/col4 

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    applymapdf.dot() 一起使用:

    df['col_list']=df.applymap(lambda x: 'SRC' in x).dot(df.columns + '/').str[:-1]
    

    applyseries.str.contains()df.dot

    df['col_list']=df.apply(lambda x: 
                      x.str.contains('SRC',na=False)).dot(df.columns + '/').str[:-1]
    print(df)
    

          col1 col2 col3 col4        col_list
    0  foo SRC  foo  SRC  SRC  col1/col3/col4
    1      bar  bar  bar  SRC            col4
    2      baz  baz  SRC  SRC       col3/col4
    

    【讨论】:

    • 谢谢!那很快:)
    • 总是很高兴看到dot 解决方案:) +1
    猜你喜欢
    • 1970-01-01
    • 2018-10-15
    • 2020-07-06
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2014-12-10
    • 1970-01-01
    相关资源
    最近更新 更多