Итак, у меня есть список фреймов данных 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
Однако это не дает результата, который я ищу.
Вы можете использовать списки, чтобы получить подмножество столбцов, которые находятся в 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
]
Ваше второе редактирование, на мой взгляд, лучшее (и наиболее читаемое) решение.
Вы должны использовать понимание списка:
[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, так как вы собираетесь использовать pd.concat в полученном списке. Я предполагаю, что это то, что делает остальная часть кода OP.
@Markus «Я хочу просмотреть каждый фрейм данных df_list и создать новый фрейм данных только со столбцами в col_list».
Хм, но Bjc51192 утверждает, что некоторые фреймы данных не содержат всех столбцов, перечисленных в col_list, что (как я понял) вызывает у него ошибки.
@Маркус, ты хорошо замечаешь, спасибо! В этих случаях следует использовать переиндексацию.
Энди, это сработало идеально. Один вопрос, когда я переиндексирую, что происходит с dfs, которые не содержат определенного столбца? Получит ли он 1 на своем месте?
@Bjc51192 Bjc51192 получает NaN, вы можете заполнить na(1), если этого недостаточно :)
Немного непонятно, о чем вы спрашиваете. Не могли бы вы добавить список из пары минимальных фреймов входных данных и пример вывода, который вы хотели бы получить?