pandas数据框中的Groupby和shift



假设我有一个数据帧

Sym    C    O    R
01.01.2020   AAPL   100  115  0.2
01.01.2020   AA     200  205  0.4
02.01.2020   AAPL   101  116  0.3
02.01.2020   AA     201  206  0.2
02.01.2020   MM     298  300  0.5
03.01.2020   AAPL   110  105  0.3
03.01.2020   AA     203  204  0.1
03.01.2020   MM     301  303  0.2
04.01.2020   AAPL   108  113  0.3
04.01.2020   AA     200  201  0.4
04.01.2020   MM     302  300  0.3

我如何创建一个新的数据框架,它将为每个以前的日期创建新的列,并在3个周期内移动?

我希望

Sym    C_1    O_1    R_1  C_2  O_2  R_2  C_3  O_3  R_3    
01.01.2020   AAPL   NaN    NaN ...                              NaN
01.01.2020   AA     NaN    NaN ...                              NaN
02.01.2020   AAPL   100    115    0.2  NaN  NaN  NaN  NaN  NaN  NaN   
02.01.2020   AA     200    205    0.4  NaN  NaN  NaN  NaN  NaN  NaN                                                                                                
02.01.2020   MM     NaN    NaN ...                              NaN                                        
03.01.2020   AAPL   101    116   0.3   100  115  0.2  NaN  NaN  NaN                                       
03.01.2020   AA     201    206   0.2   200  205  0.4  NaN  NaN  NaN                                  
03.01.2020   MM     298    300   0.5   NaN  NaN  ..             NaN                                      
04.01.2020   AAPL   101    116   0.3   100  115  0.2  110  105  0.3    
04.01.2020   AA     203    204   0.1   201  206  0.2  200  205  0.4                               
04.01.2020   MM     301    303   0.2   298  300  0.5  Nan  NaN  NaN                                

在组内使用pandas.shift()中提供的答案并没有给出我所期望的。我试过了:

def shift_data (df):
df= df.shift(3)
return df
data.groupby('Sym',  group_keys=False).apply(shift_data) #

合并groupby.shiftpandas.concat:

N = 3
out = pd.concat([df[['Sym']]] + 
[df.groupby('Sym').shift(i).add_suffix(f'_{i}')
for i in range(1, N+1)], axis=1)

输出:

Sym    C_1    O_1  R_1    C_2    O_2  R_2    C_3    O_3  R_3
01.01.2020  AAPL    NaN    NaN  NaN    NaN    NaN  NaN    NaN    NaN  NaN
01.01.2020    AA    NaN    NaN  NaN    NaN    NaN  NaN    NaN    NaN  NaN
02.01.2020  AAPL  100.0  115.0  0.2    NaN    NaN  NaN    NaN    NaN  NaN
02.01.2020    AA  200.0  205.0  0.4    NaN    NaN  NaN    NaN    NaN  NaN
02.01.2020    MM    NaN    NaN  NaN    NaN    NaN  NaN    NaN    NaN  NaN
03.01.2020  AAPL  101.0  116.0  0.3  100.0  115.0  0.2    NaN    NaN  NaN
03.01.2020    AA  201.0  206.0  0.2  200.0  205.0  0.4    NaN    NaN  NaN
03.01.2020    MM  298.0  300.0  0.5    NaN    NaN  NaN    NaN    NaN  NaN
04.01.2020  AAPL  110.0  105.0  0.3  101.0  116.0  0.3  100.0  115.0  0.2
04.01.2020    AA  203.0  204.0  0.1  201.0  206.0  0.2  200.0  205.0  0.4
04.01.2020    MM  301.0  303.0  0.2  298.0  300.0  0.5    NaN    NaN  NaN
for column in ['C','O','R']:    
df[f'{column}_1']=df.groupby('Date')[column].transform(lambda x:x.shift(1))
df[f'{column}_2']=df.groupby('Date')[column].transform(lambda x:x.shift(2))
df[f'{column}_3']=df.groupby('Date')[column].transform(lambda x:x.shift(3))

我想这个方法是可行的:

for i in range(3):
for column_name in ['C', 'R', 'O']:    
data[column_name + '_' + str(i + 1)] = data.groupby(['Sym'])[column_name].shift(i + 1)

,但请确保数据框架已排序!

最新更新