#python #pandas #dataframe #for-loop
#питон #панды #фрейм данных #для-петли
Вопрос:
У меня есть много DataFrames
таких, которые имеют разную продолжительность периода. Я пытаюсь создать for loop
, чтобы определить для всех этих кадров данных конкретный день начала и окончания.
Вот простой пример:
df1: Dates ID1 ID2 0 2021-01-01 0 1 1 2021-01-02 0 0 2 2021-01-03 1 0 3 2021-01-04 2 2 4 2021-01-05 1 4 5 2021-01-06 -1 -2 df2: Dates ID1 ID2 0 2021-01-01 0 1 1 2021-01-02 1 2 2 2021-01-03 -1 3 3 2021-01-04 1 -1 4 2021-01-05 4 2
Я хочу определить конкретный день начала и окончания как:
start = pd.to_datetime('2021-01-02') end = pd.to_datetime('2021-01-04')
До сих пор я только выяснил, как определить период для одного DataFrame
:
df1.loc[(df1['Dates'] gt;= start) amp; (df1['Dates'] lt;= end)]
Существует ли простой способ перебрать все DataFrames
одновременно, чтобы определить даты начала и окончания?
Для воспроизводимости:
import pandas as pd df1 = pd.DataFrame({ 'Dates':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05', '2021-01-06'], 'ID1':[0,0,1,2,1,-1], 'ID2':[1,0,0,2,4,-2]}) df1['Dates'] = pd.to_datetime(df1['Dates']) df2 = pd.DataFrame({ 'Dates':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05'], 'ID1':[0,1,-1,1,4], 'ID2':[1,2,3,-1,2]}) df2['Dates'] = pd.to_datetime(df2['Dates'])
Ответ №1:
Вы можете сохранить свои кадры данных в списке, а затем применить свою loc
формулу ко всем кадрам данных в списке, используя list
понимание, и вернуть новый список полученных отфильтрованных кадров данных:
# Create a list with your dataframes dfs = [df1 , df2] # Thresholds start = pd.to_datetime('2021-01-02') end = pd.to_datetime('2021-01-04') # Filter all of them and store back filtered_dfs = [df.loc[(df['Dates'] gt;= start) amp; (df['Dates'] lt;= end)] for df in dfs]
Результат:
gt;gt;gt; print(filtered_dfs) [ Dates ID1 ID2 1 2021-01-02 0 0 2 2021-01-03 1 0 3 2021-01-04 2 2, Dates ID1 ID2 1 2021-01-02 1 2 2 2021-01-03 -1 3 3 2021-01-04 1 -1] gt;gt;gt; print(dfs) [ Dates ID1 ID2 0 2021-01-01 0 1 1 2021-01-02 0 0 2 2021-01-03 1 0 3 2021-01-04 2 2 4 2021-01-05 1 4 5 2021-01-06 -1 -2, Dates ID1 ID2 0 2021-01-01 0 1 1 2021-01-02 1 2 2 2021-01-03 -1 3 3 2021-01-04 1 -1 4 2021-01-05 4 2]
Комментарии:
1. Большое спасибо за ваш ответ. Поскольку у меня много наборов данных, возможно ли также напрямую получить отдельные наборы данных, а не все, объединенные в filtered_dfs? В противном случае мне придется снова выбрать все из filtered_dfs.
2. Чтобы использовать цикл for, хотя вам нужно будет иметь их в одном месте. Иначе как бы вы зациклились на них? Возможно, вы можете использовать подход, подобный описанному выше, а затем разбить список (или словарь) фреймов данных на отдельные объекты?
3. О’кей, я понимаю, спасибо
4. Лично я предпочитаю хранить фреймы данных в словаре, например, с именами в качестве ключей , чтобы затем ссылаться на них, используя ссылки на их имена
df_dict[df1]
df1
,df_dict[df2]
ссылкиdf2
и так далее.