遍历熊猫数据框

时间:2020-07-30 20:47:29

标签: python pandas loops date sliding

数据框:

       date      A    B    C    D
index
0      2015-01   ..   ..   ..   ..
1      2015-01   ..   ..   ..   ..
2      2015-02   ..   ..   ..   ..
3      2015-02   ..   ..   ..   ..
4      2015-03   ..   ..   ..   ..
5      2015-03   ..   ..   ..   ..
6      2015-04   ..   ..   ..   ..
7      2015-04   ..   ..   ..   ..
8      2015-05   ..   ..   ..   ..
9      2015-05   ..   ..   ..   ..
...
1000   ...       ..   ..   ..   ..

我想使用从固定窗口开始的日期(pd.to_datetime)进行迭代(例如,前三个月[2015-01、2015-01、2015-02、2015-02、2015-03、2015-03 ])并返回一个数据框:

       date      A    B    C    D
index
0      2015-01   ..   ..   ..   ..
1      2015-01   ..   ..   ..   ..
2      2015-02   ..   ..   ..   ..
3      2015-02   ..   ..   ..   ..
4      2015-03   ..   ..   ..   ..
5      2015-03   ..   ..   ..   ..

然后添加下个月[2015-04,2015-04]并删除最早的一个[2015-01,2015-01],返回下一个数据帧:

       date      A    B    C    D
index
2      2015-02   ..   ..   ..   ..
3      2015-02   ..   ..   ..   ..
4      2015-03   ..   ..   ..   ..
5      2015-03   ..   ..   ..   ..
6      2015-04   ..   ..   ..   ..
7      2015-04   ..   ..   ..   ..

一直持续到数据结束。

我发现了以下代码:

periods = len(dataframe)
fxw = 3

for i in range(0, periods):
    start = i                       
    if i + fxw > periods:              
       break
    else: end_df = i + fxw
 
# output:
 
# df1
       date      A    B    C    D
index
0      2015-01   ..   ..   ..   ..
1      2015-01   ..   ..   ..   ..
2      2015-02   ..   ..   ..   ..

# df2
       date      A    B    C    D
index
3      2015-02   ..   ..   ..   ..
4      2015-03   ..   ..   ..   ..
5      2015-03   ..   ..   ..   ..
 
...
# dfend 

在这里我可以设置一个固定的窗口(fxw = 3)来遍历数据帧的长度3行,直到数据结束。 (例如,如果数据帧有12行,它将返回4个数据帧,每个3行)。但是,通过这种方式,我既没有按日期选择窗口,也没有删除最后一个数据点并添加下一个数据点。我还没有弄清楚该怎么做。如果有人有可能的解决方案/建议,将不胜感激! 谢谢!

2 个答案:

答案 0 :(得分:2)

这是一种方法。首先建立一个数据框:

import numpy as np
import pandas as pd

date = [ f'2015-{i:02d}' for i in range(1, 7) ]
date = np.repeat(date, 2)
date = [pd.Period(d) for d in date]

n = len(date)
amt = [10 * i for i in range(n)]

df = pd.DataFrame({'date': date, 'amt': amt})

print(df.head())

接下来,使用数据框中的最小日期和最大日期来构建周期范围:

period_range = pd.period_range(start=df['date'].min(), 
                               end=df['date'].max(), 
                               freq='M')

现在,遍历数据框:

months_in_window = 2

for start, end in zip(period_range, period_range[months_in_window - 1: ]):
    mask = (start <= df['date']) & (df['date'] <= end)
    print(df[mask], end='\n\n')

      date  amt
0  2015-01    0
1  2015-01   10
2  2015-02   20
3  2015-02   30

      date  amt
2  2015-02   20
3  2015-02   30
4  2015-03   40
5  2015-03   50

<rest of output omitted to save space>

您经常可以使用熊猫工具(包括groupbyrolling)来避免在数据框架上进行迭代。

更新:

我们可以控制一个窗口的长度,以及从一个窗口开始到下一个窗口开始的时间:

# create list of periods
periods = pd.period_range(start='2020-01-01', periods=24, freq='M')

# create parameters
months_in_window = 3   # start of window i to end of window i
step = 5               # start of window i to start of window i+1

# create start and end points for each window
windows = [
    (start, end)
    for start, end 
        in zip(periods[::step], periods[window_size-1::step])
]

for w in windows: print(w)

(Period('2020-01', 'M'), Period('2020-03', 'M'))
(Period('2020-06', 'M'), Period('2020-08', 'M'))
(Period('2020-11', 'M'), Period('2021-01', 'M'))
(Period('2021-04', 'M'), Period('2021-06', 'M'))
(Period('2021-09', 'M'), Period('2021-11', 'M'))

最后,迭代一个数据帧看起来像这样(不更改掩码):

for start, end in windows:
    mask = (start <= df['date']) & (df['date'] <= end)
    print(df[mask], end='\n\n')

答案 1 :(得分:0)

如果我了解正确性,则希望遍历数据框并每次获取4行的块。您可以尝试这样的操作并根据需要进行调整:

首先按日期对数据框进行排序。为此,您可以使用sort_values函数:

df = your_df.sort_values(by='date') 

请注意,如果您的日期列格式不是正确的日期时间格式,那么您需要在排序之前进行以下操作:

your_df['date'] =pd.to_datetime(your_df.date)

然后您可以使用for循环

for i in range(0, len(df), 4): # the 4 here means return a chunk of 4 rows
    chunk = df.iloc[i:i+4, :]
    print(chunk)
    # do your magic