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))
我知道这个问题是两年前提出的,但答案可能会帮助其他人谢谢。我应该想到这一点。