Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用groupby按分区移位_Python_Pandas - Fatal编程技术网

Python 使用groupby按分区移位

Python 使用groupby按分区移位,python,pandas,Python,Pandas,我有一个数据框,其中有一列我想移动,但要在分区上移动,而不是在整个数据框上移动 例如,我想从这个数据帧开始: State, Year, GDP NY,2011,100 NY,2012,110 NY,2013,120 CA,2011,70 CA,2012,80 CA,2013,90 State, Year, GDP, GDP y-1 NY,2011,100,NaN NY,2012,110,100 NY,2013,120,110 CA,2011,70,NaN CA,2012,80,70 CA,20

我有一个数据框,其中有一列我想移动,但要在分区上移动,而不是在整个数据框上移动

例如,我想从这个数据帧开始:

State, Year, GDP
NY,2011,100
NY,2012,110
NY,2013,120
CA,2011,70
CA,2012,80
CA,2013,90
State, Year, GDP, GDP y-1
NY,2011,100,NaN
NY,2012,110,100
NY,2013,120,110
CA,2011,70,NaN
CA,2012,80,70
CA,2013,90,80
对于此数据帧:

State, Year, GDP
NY,2011,100
NY,2012,110
NY,2013,120
CA,2011,70
CA,2012,80
CA,2013,90
State, Year, GDP, GDP y-1
NY,2011,100,NaN
NY,2012,110,100
NY,2013,120,110
CA,2011,70,NaN
CA,2012,80,70
CA,2013,90,80
到目前为止,我使用的代码如下:

grouped = df.groupby("State")
for state, state_df in grouped:
    state_df["GDP Y-1"]=state_df["GDP"].shift(1)

我相信这会为每个状态提供我想要的,但我不知道如何将它们组合在一起(基本上只是将每个数据帧附加到另一个数据帧之下)。我该怎么做?

您可以将中间数据帧存储在列表中,并使用
pd.concat
将它们连接在一起:

grouped = df.groupby("State")
L = []
for state, state_df in grouped:
    state_df["GDP Y-1"]=state_df["GDP"].shift(1)
    L.append(state_df)

pd.concat(L)
Out[149]: 
  State  Year  GDP  GDP Y-1
3    CA  2011   70      NaN
4    CA  2012   80       70
5    CA  2013   90       80
0    NY  2011  100      NaN
1    NY  2012  110      100
2    NY  2013  120      110

下面这行完成了这个任务

df['GDP Y-1'] = df.groupby('State')['GDP'].transform(lambda x: x.shift(1))

我知道这个问题是两年前提出的,但答案可能会帮助其他人

谢谢。我应该想到这一点。