Найти столбец, имя которого содержит определенную строку
У меня есть фрейм данных с именами столбцов, и я хочу найти тот, который содержит определенную строку, но не точно соответствует ей. Я ищу 'spike'
в именах столбцов, таких как 'spike-2'
, 'hey spike'
, 'spiked-in'
(часть 'spike'
всегда непрерывна).
Я хочу, чтобы имя столбца возвращалось в виде строки или переменной, поэтому я получаю доступ к столбцу позже с помощью df['name']
или df[name]
как обычно. Я пытался найти способы сделать это, но безрезультатно. Какие-нибудь советы?
Ответы
Ответ 1
Просто перейдите по DataFrame.columns
, теперь это пример, в котором вы получите список имен столбцов, которые соответствуют:
import pandas as pd
data = {'spike-2': [1,2,3], 'hey spke': [4,5,6], 'spiked-in': [7,8,9], 'no': [10,11,12]}
df = pd.DataFrame(data)
spike_cols = [col for col in df.columns if 'spike' in col]
print(list(df.columns))
print(spike_cols)
Вывод:
['hey spke', 'no', 'spike-2', 'spiked-in']
['spike-2', 'spiked-in']
Пояснение:
-
df.columns
возвращает список имен столбцов
-
[col for col in df.columns if 'spike' in col]
выполняет итерацию по списку df.columns
с переменной col
и добавляет ее в результирующий список, если col
содержит 'spike'
. Этот синтаксис понимание списка.
Если вы хотите, чтобы результирующий набор данных с соответствующими столбцами, вы можете сделать это:
df2 = df.filter(regex='spike')
print(df2)
Вывод:
spike-2 spiked-in
0 1 7
1 2 8
2 3 9
Ответ 2
Этот ответ использует метод DataFrame.filter для этого без понимания списка:
import pandas as pd
data = {'spike-2': [1,2,3], 'hey spke': [4,5,6]}
df = pd.DataFrame(data)
print(df.filter(like='spike').columns)
Выведет только "шип-2". Вы также можете использовать регулярное выражение, как некоторые люди предложили в комментариях выше:
print(df.filter(regex='spike|spke').columns)
Выведет обе колонки: ['spike-2', 'hey spke']
Ответ 3
Вы также можете использовать df.columns[df.columns.str.contains(pat = 'spike')]
data = {'spike-2': [1,2,3], 'hey spke': [4,5,6], 'spiked-in': [7,8,9], 'no': [10,11,12]}
df = pd.DataFrame(data)
colNames = df.columns[df.columns.str.contains(pat = 'spike')]
print(colNames)
Это выведет имена столбцов: 'spike-2', u'spiked-in'
Подробнее о pandas.Series.str.contains.
Ответ 4
# select columns containing 'spike'
df.filter(like='spike', axis=1)
Вы также можете выбрать по имени, регулярное выражение. Обратитесь к: pandas.DataFrame.filter
Ответ 5
Вы также можете использовать этот код:
spike_cols =[x for x in df.columns[df.columns.str.contains('spike')]]
Ответ 6
df.loc[:,df.columns.str.contains("spike")]