python - Pandas 具有多索引的一阶差分面板数据

标签 python pandas multi-index panel-data

我有两个具有相同变量但来自不同年份的数据框:

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/

相关文章:

python - 如何在python中的ftplib中自动添加密码短语

python - 128x512 数组列表中的图像列表可提高效率

python - Django 注册:如何包含自定义后端?

python - 通过替换计算两个数据框中两列的减法

python - 如何使用多索引过滤器为列分配值?

python - 如何在 Python 中加载网站的所有资源,包括 AJAX 请求等?

python - 在 DataFrame 中使用正则表达式 - 最后 5 个字符

python - 在 Pandas Dataframe 中查找所有模式的索引

MongoDB 将所有现有索引迁移到新数据库

python - 计算具有多列的 pandas 数据框中的聚合值