首页 > 解决方案 > 在 pandas Dataframe 的每一行中搜索一个字符串并返回找到的列名

问题描述

有没有办法在 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 

标签: pythonpandas

解决方案


applymap与 一起使用df.dot()

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

apply使用series.str.contains()and 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

推荐阅读