我有两个具有相同变量但来自不同年份的数据框:
df2016 = pd.DataFrame({"ID": [100,101,102,103], "A": [1,2,3,4], "B": [2,4,6,8], "year": [2016,2016,2016,2016]})
ID A B year
0 100 1 2 2016
1 101 2 4 2016
2 102 3 6 2016
3 103 4 8 2016
df2017 = pd.DataFrame({"ID": [100,101,102,103], "A": [5,6,7,8], "B": [9,11,13,15], "year": [2017,2017,2017,2017]})
ID A B year
0 100 5 9 2017
1 101 6 11 2017
2 102 7 13 2017
3 103 8 15 2017
我想将这些组合起来,然后对变量“A”与时间进行一阶差分,以创建一个新变量“delta_A”,该变量为每个“ID”提供 2017 年至 2016 年间“A”的变化。结果应该是这样的
期望的输出
A B delta_A
ID year
100 2016 1 2 NaN
101 2016 2 4 NaN
102 2016 3 6 NaN
103 2016 4 8 NaN
100 2017 5 9 4
101 2017 6 11 4
102 2017 7 13 4
103 2017 8 15 4
如果可能的话,我想在 multi_index 设置中工作,因为我认为这对其他事情很有用。其他答案展示了如何使用 series.diff() 方法进行一阶差分,但没有展示如何使用多索引。
这是我尝试过的:
df = pd.concat([df2016, df2017])
df
ID A B year
0 100 1 2 2016
1 101 2 4 2016
2 102 3 6 2016
3 103 4 8 2016
0 100 5 9 2017
1 101 6 11 2017
2 102 7 13 2017
3 103 8 15 2017
df.set_index(["ID", "year"], inplace=True)
df
A B
ID year
100 2016 1 2
101 2016 2 4
102 2016 3 6
103 2016 4 8
100 2017 5 9
101 2017 6 11
102 2017 7 13
103 2017 8 15
实际输出(不需要)
df["delta_A"] = df["A"].diff()
df
A B delta_A
ID year
100 2016 1 2 NaN
101 2016 2 4 1.0
102 2016 3 6 1.0
103 2016 4 8 1.0
100 2017 5 9 1.0
101 2017 6 11 1.0
102 2017 7 13 1.0
103 2017 8 15 1.0
这是 ID 维度而不是年份维度的一阶差分。我希望它与年份维度有关的一阶差分,如上面我想要的输出所示。
另一种方法是创建“A”的滞后版本,然后从“A”中减去它,但我不确定如何在多索引中执行此操作。
谢谢!
最佳答案
在给定的示例中,您可以简单地使用groupby
+ diff
。注意:此方法仅在数据帧按年份排序时才有效。
df['delta_A'] = df.groupby(level=0)['A'].diff()
如果您喜欢通过手动访问多索引值来获取diff
的替代方法,这里有另一种更强大的方法:
s1 = df.loc[(slice(None), 2017), 'A']
s2 = df.loc[(slice(None), 2016), 'A']
df['delta_A'] = s1.sub(s2.droplevel(1))
A B delta_A
ID year
100 2016 1 2 NaN
101 2016 2 4 NaN
102 2016 3 6 NaN
103 2016 4 8 NaN
100 2017 5 9 4.0
101 2017 6 11 4.0
102 2017 7 13 4.0
103 2017 8 15 4.0
关于python - Pandas 具有多索引的一阶差分面板数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72859690/