Поиск значения во всех столбцах фрейма данных (кроме первого столбца!) и добавление нового столбца с соответствующим именем столбца

#python-3.x #pandas

#python-3.x #pandas

Вопрос:

Я хотел бы выполнить поиск по всем столбцам (кроме первого столбца!) фрейма данных и добавить новый столбец (например, ‘Column_Match’) с именем соответствующего столбца.

Я пробовал что-то вроде этого:

 df.apply(lambda row: row.astype(str).str.contains('my_keyword').any(), axis=1)
  

Но это не исключает первый столбец, и я не знаю, как вернуть и добавить имя столбца.

Любая помощь приветствуется!

Комментарии:

1. df.iloc[:,1:].apply(lambda row: row.astype(str).str.contains('my_keyword').any(), axis=1) ??

2. @anky_91: Я предполагаю, что это пропускает первый столбец ( iloc[:,1:] ), но как я могу добавить соответствующее имя столбца a в новый столбец?

Ответ №1:

Если нужны столбцы с именем первого совпадающего значения в строках, добавьте новый столбец для совпадения несуществующих значений по DataFrame.assign и DataFrame.idxmax для имени столбца:

 df = pd.DataFrame({
         'B':[4,5,4,5,5,4],
         'A':list('abcdef'),
         'C':list('akabbe'),
         'F':list('eakbbb')
})


f = lambda row: row.astype(str).str.contains('e')
df['new'] = df.iloc[:,1:].apply(f, axis=1).assign(missing=True).idxmax(axis=1)
print (df)
   B  A  C  F      new
0  4  a  a  e        F
1  5  b  k  a  missing
2  4  c  a  k  missing
3  5  d  b  b  missing
4  5  e  b  b        A
5  4  f  e  b        C
  

Если нужны имена всех столбцов со всеми совпадающими значениями, создайте логический фрейм данных и используйте точечное произведение с именами столбцов по DataFrame.dot и Series.str.rstrip :

 f = lambda row: row.astype(str).str.contains('a')
df1 = df.iloc[:,1:].apply(f, axis=1)
df['new'] = df1.dot(df.columns[1:]   ', ').str.rstrip(', ').replace('', 'missing')
print (df)
   B  A  C  F      new
0  4  a  a  e     A, C
1  5  b  k  a        F
2  4  c  a  k        C
3  5  d  b  b  missing
4  5  e  b  b  missing
5  4  f  e  b  missing
  

Комментарии:

1. Отлично. Второй пример завершает его!