我有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)。
答案 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
这个答案使用了多索引数据框并且一步一步地进行,这(至少对我来说)更容易阅读。