#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. Отлично. Второй пример завершает его!