python pandas滚动窗口并重新创建数据框

时间:2016-03-30 16:07:48

标签: python pandas dataframe

我有DataFrame看起来像这样

df = pd.DataFrame({'user' : ['A', 'A', 'A', 'B', 'B', 'B','B'],
                  'attritube1' : [0,1,1,1,0,2,9], 
                  'attritube2':[1,2,3,3,0,0,1]})
print(df)

     attritube1  attritube2 user
0           0           1    A
1           1           2    A
2           1           3    A
3           1           3    B
4           0           0    B
5           2           0    B
6           9           1    B

我想使用长度为K 的滚动窗口为每个用户切片数据,并创建一个新的数据集。例如,如果K = 2,那么我想得到

   attritube1  attritube2 user
0           0           1    A
1           1           2    A
---------------------------------
2           1           2    A
3           1           3    A
---------------------------------
4           1           3    B
5           0           0    B
---------------------------------
6           0           0    B
7           2           0    B
--------------------------------
8           2           0    B
9           9           1    B

同样,如果K = 3,则新数据框应为

    attritube1  attritube2 user
0           0           1    A
1           1           2    A
2           1           3    A
--------------------------------
3           1           3    B
4           0           0    B
5           2           0    B
--------------------------------
6           0           0    B
7           2           0    B
8           9           1    B

我们可以假设对于所有用户,行数> = K.谢谢!

编辑:想澄清我想为每个用户重复滚动窗口程序(玩具示例中的A,B)。

2 个答案:

答案 0 :(得分:1)

尝试:

k=3
pd.concat([df.groupby('user').apply(lambda x: pd.concat([x.iloc[i: i + k] for i in range(len(x.index) - k + 1)]))])


        attribute1  attribute2 user
user                               
A    0           0           1    A
     1           1           2    A
     2           1           3    A
B    3           1           3    B
     4           0           0    B
     5           2           0    B
     4           0           0    B
     5           2           0    B
     6           9           1    B

答案 1 :(得分:0)

 df = pd.DataFrame({'user' : ['A', 'A', 'A', 'B', 'B', 'B','B','A', 'A', 'A', 'B', 'B', 'C','B','A', 'C', 'C', 'B', 'B', 'B','B'],
              'attritube1' : [0,1,1,1,0,2,9,0,1,1,1,0,2,9,0,1,1,1,0,2,9], 
              'attritube2':[1,2,3,3,0,0,1,0,1,1,1,0,2,9,0,1,1,1,0,2,9]})


 # creating Multi Index Data Frame
 m_df=df.set_index(df["user"],append=True)
 m_df=m_df.swaplevel(0,1,axis=0)


 k=2


 final_df=pd.concat([m_df.loc[item].iloc[:k] for item in sorted(set(df["user"]))])
 final_df.index=range(final_df.shape[0])  # to resort the index 


print final_df

这个答案使用了多索引数据框并且一步一步地进行,这(至少对我来说)更容易阅读。