Определите дату начала и окончания нескольких кадров данных с помощью pandas

#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 и так далее.