Список подмножеств фреймов данных по имени столбца

Итак, у меня есть список фреймов данных df_list=[df1,df2,df3] и список заголовков столбцов, которые меня интересуют. col_list=['Fire','Water','Wind','Hail']

Я хочу перебрать каждый фрейм данных df_list и создать новый фрейм данных только со столбцами в col_list. Проблема в том, что если один из элементов в col_list не находится в df, я все еще хочу, чтобы он сделал фрейм данных просто без этого столбца.

То, что я пытался сделать, это,

for data_frame in df_list:
   try:
       data_frame=data_frame[['Fire','Water','Wind','Hail']]
   except:
        continue

Однако это не дает результата, который я ищу.

Немного непонятно, о чем вы спрашиваете. Не могли бы вы добавить список из пары минимальных фреймов входных данных и пример вывода, который вы хотели бы получить?

Mike 28.05.2019 23:42
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать списки, чтобы получить подмножество столбцов, которые находятся в col_list. Однако, когда вы итерируете, переменная data_frame имеет только ссылку на объект, ее изменение фактически не изменит элемент в массиве. Вы можете сохранить другой список с «вспомогательными фреймами данных».

sub_df_list = []
for data_frame in df_list:
    sub_df_list.append(
        data_frame[[col for col in data_frame.columns if col in col_list]]
    )

Редактировать:

Как указано в другом ответе, вы можете сделать это как понимание единого списка... что немного сложно для глаз:

sub_df_list = [
    data_frame[[col for col in data_frame.columns if col in col_list]]
    for data_frame in df_list
]

Редактировать 2:

Столбцы Pandas — это Index объект. У них есть операции набора, такие как intersection. Самый простой способ сделать то, что вам нужно, это:

sub_df_list = [
    data_frame[data_frame.columns.intersection(col_list)] for data_frame in df_list
]

Ваше второе редактирование, на мой взгляд, лучшее (и наиболее читаемое) решение.

Markus 29.05.2019 00:54
Ответ принят как подходящий

Вы должны использовать понимание списка:

[data_frame[['Fire','Water','Wind','Hail']] for data_frame in df_list]

Если в некоторых data_frames нет всех столбцов, вы можете вместо этого использовать переиндексировать:

[data_frame.reindex(columns=['Fire','Water','Wind','Hail']) for data_frame in df_list]

Внутри цикла for:

data_frame=data_frame[['Fire','Water','Wind','Hail']]

перезаписывает переменную data_frame, НО не обновляет i-й элемент df_list.
Это эквивалентно следующему коду:

In [11]: a = [1, 2, 3]

In [12]: for i in a:
    ...:     i = i + 1
    ...:

In [13]: a
Out[13]: [1, 2, 3]

Каким образом это решает проблему OP с различными столбцами? Кроме того, я не понимаю, почему понимание списка помогает решить проблему.

Markus 28.05.2019 23:51

@Markus, так как вы собираетесь использовать pd.concat в полученном списке. Я предполагаю, что это то, что делает остальная часть кода OP.

Andy Hayden 28.05.2019 23:54

@Markus «Я хочу просмотреть каждый фрейм данных df_list и создать новый фрейм данных только со столбцами в col_list».

Andy Hayden 28.05.2019 23:55

Хм, но Bjc51192 утверждает, что некоторые фреймы данных не содержат всех столбцов, перечисленных в col_list, что (как я понял) вызывает у него ошибки.

Markus 29.05.2019 00:02

@Маркус, ты хорошо замечаешь, спасибо! В этих случаях следует использовать переиндексацию.

Andy Hayden 29.05.2019 00:06

Энди, это сработало идеально. Один вопрос, когда я переиндексирую, что происходит с dfs, которые не содержат определенного столбца? Получит ли он 1 на своем месте?

Bjc51192 29.05.2019 00:22

@Bjc51192 Bjc51192 получает NaN, вы можете заполнить na(1), если этого недостаточно :)

Andy Hayden 29.05.2019 00:51

Другие вопросы по теме