熊猫在groupby之后移动多列会导致按字母顺序移动列

时间:2019-04-17 10:10:13

标签: python-3.x pandas dataframe

这是我的数据框:

    Zip_Code  Year  Month          Z          Y          X
0      75001  2009      1  15.305484   8.798710   2.188065
1      75001  2009      2  19.048929  13.492143   7.600714
2      75001  2009      3  20.611290  15.179032   9.875806
3      75001  2009      4  24.483000  18.444333  12.760667
4      75001  2009      5  28.280968  22.974516  18.156129
5      75001  2009      6  34.353333  28.962667  23.890000
6      75001  2009      7  35.682258  30.250645  25.270645
7      75001  2009      8  35.323548  29.731935  24.554194
8      75001  2009      9  29.390667  24.611667  20.113000
9      75001  2009     10  22.349032  17.384194  12.510968
10     75001  2009     11  20.927000  15.519333   9.945000
11     75001  2009     12  10.628710   6.182903   1.632258
12     75001  2010      1  11.685806   7.114839   2.366774
13     75001  2010      2   9.624643   5.773214   1.866071
14     75001  2010      3  19.230645  13.315161   7.654516
15     75001  2010      4  24.945667  19.666000  14.668667
16     75001  2010      5  30.663548  25.054194  19.930000
17     75001  2010      6  35.557667  30.203667  25.483667
18     75001  2010      7  34.858065  30.072258  25.700323
19     75001  2010      8  38.173226  32.203871  26.972581

我想从去年的同一个月获取Z,Y和X列的读数。这是我尝试以下代码时得到的:

df_temp[['A', 'B', 'C']] = df_temp.groupby(['Zip_Code', 'Month'])[['Z', 'Y', 'X']].shift()

Zip_Code  Year  Month          Z          Y          X          A  \
0      75001  2009      1  15.305484   8.798710   2.188065        NaN   
1      75001  2009      2  19.048929  13.492143   7.600714        NaN   
2      75001  2009      3  20.611290  15.179032   9.875806        NaN   
3      75001  2009      4  24.483000  18.444333  12.760667        NaN   
4      75001  2009      5  28.280968  22.974516  18.156129        NaN   
5      75001  2009      6  34.353333  28.962667  23.890000        NaN   
6      75001  2009      7  35.682258  30.250645  25.270645        NaN   
7      75001  2009      8  35.323548  29.731935  24.554194        NaN   
8      75001  2009      9  29.390667  24.611667  20.113000        NaN   
9      75001  2009     10  22.349032  17.384194  12.510968        NaN   
10     75001  2009     11  20.927000  15.519333   9.945000        NaN   
11     75001  2009     12  10.628710   6.182903   1.632258        NaN   
12     75001  2010      1  11.685806   7.114839   2.366774   2.188065   
13     75001  2010      2   9.624643   5.773214   1.866071   7.600714   
14     75001  2010      3  19.230645  13.315161   7.654516   9.875806   
15     75001  2010      4  24.945667  19.666000  14.668667  12.760667   
16     75001  2010      5  30.663548  25.054194  19.930000  18.156129   
17     75001  2010      6  35.557667  30.203667  25.483667  23.890000   
18     75001  2010      7  34.858065  30.072258  25.700323  25.270645   
19     75001  2010      8  38.173226  32.203871  26.972581  24.554194   

            B          C  
0         NaN        NaN  
1         NaN        NaN  
2         NaN        NaN  
3         NaN        NaN  
4         NaN        NaN  
5         NaN        NaN  
6         NaN        NaN  
7         NaN        NaN  
8         NaN        NaN  
9         NaN        NaN  
10        NaN        NaN  
11        NaN        NaN  
12   8.798710  15.305484  
13  13.492143  19.048929  
14  15.179032  20.611290  
15  18.444333  24.483000  
16  22.974516  28.280968  
17  28.962667  34.353333  
18  30.250645  35.682258  
19  29.731935  35.323548  

现在我想要分别在A,B和C列中Z,Y和X的偏移值,但实际上是将X的偏移值放在A中,依此类推。我也尝试了以下方法,但是也没有用。

df_temp[['A', 'B', 'C']] = df_temp.groupby(['Zip_Code', 'Month'], sort=False)[['Z', 'Y', 'X']].shift()

1 个答案:

答案 0 :(得分:2)

您必须在sort=False中包含参数groupby

df_temp[['A', 'B', 'C']] = df_temp.groupby(['Zip_Code', 'Month'], sort=False)[['Z', 'Y', 'X']].shift()

print(df_temp)

    Zip_Code  Year  Month          Z          Y          X          A  \
0      75001  2009      1  15.305484   8.798710   2.188065        NaN   
1      75001  2009      2  19.048929  13.492143   7.600714        NaN   
2      75001  2009      3  20.611290  15.179032   9.875806        NaN   
3      75001  2009      4  24.483000  18.444333  12.760667        NaN   
4      75001  2009      5  28.280968  22.974516  18.156129        NaN   
5      75001  2009      6  34.353333  28.962667  23.890000        NaN   
6      75001  2009      7  35.682258  30.250645  25.270645        NaN   
7      75001  2009      8  35.323548  29.731935  24.554194        NaN   
8      75001  2009      9  29.390667  24.611667  20.113000        NaN   
9      75001  2009     10  22.349032  17.384194  12.510968        NaN   
10     75001  2009     11  20.927000  15.519333   9.945000        NaN   
11     75001  2009     12  10.628710   6.182903   1.632258        NaN   
12     75001  2010      1  11.685806   7.114839   2.366774  15.305484   
13     75001  2010      2   9.624643   5.773214   1.866071  19.048929   
14     75001  2010      3  19.230645  13.315161   7.654516  20.611290   
15     75001  2010      4  24.945667  19.666000  14.668667  24.483000   
16     75001  2010      5  30.663548  25.054194  19.930000  28.280968   
17     75001  2010      6  35.557667  30.203667  25.483667  34.353333   
18     75001  2010      7  34.858065  30.072258  25.700323  35.682258   
19     75001  2010      8  38.173226  32.203871  26.972581  35.323548   

            B          C  
0         NaN        NaN  
1         NaN        NaN  
2         NaN        NaN  
3         NaN        NaN  
4         NaN        NaN  
5         NaN        NaN  
6         NaN        NaN  
7         NaN        NaN  
8         NaN        NaN  
9         NaN        NaN  
10        NaN        NaN  
11        NaN        NaN  
12   8.798710   2.188065  
13  13.492143   7.600714  
14  15.179032   9.875806  
15  18.444333  12.760667  
16  22.974516  18.156129  
17  28.962667  23.890000  
18  30.250645  25.270645  
19  29.731935  24.554194