Pandas Dataframe 中的分组和移位

ee7vknir  于 2023-01-04  发布在  其他
关注(0)|答案(3)|浏览(175)

假设我有一个数据框

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

Use pandas.shift() within a group中提供的答案没有给予我所期望的。我还尝试了:

def shift_data (df):
    df= df.shift(3)
    return df

data.groupby('Sym',  group_keys=False).apply(shift_data) #
ca1c2owp

ca1c2owp1#

合并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
cigdeys3

cigdeys32#

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))
egmofgnx

egmofgnx3#

我想这个方法是可行的:

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)

但要确保您的 dataframe 已排序!

相关问题