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

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",该变量给出2017年至2016年间每个"ID"的"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_索引设置中工作,因为我认为这对其他事情很有用.其他答案显示了如何使用序列.diff()方法,但不显示如何使用多索引.

以下是我try 的内容:

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"中减go ,但我不知道如何在多索引中做到这一点.

谢谢

推荐答案

在给定的示例中,您可以简单地使用groupby+diff.注:这种方法仅在数据帧按year排序时有效.

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相关问答推荐

如何在Python中使用Iscolc迭代器实现观察者模式?

根据客户端是否正在传输响应来更改基于Flask的API的行为

从嵌套极轴列的列表中删除元素

Django.core.exceptions.SynchronousOnlyOperation您不能从异步上下文中调用它-请使用线程或SYNC_TO_ASYNC

将相应的值从第2列合并到第1列(Pandas )

来自任务调度程序的作为系统的Python文件

如何在Polars中处理用户自定义函数的多行结果?

删除另一个div中的特定div容器

将多行数据循环到嵌套框架中的单行

如何仅使用数据帧操作获得特定的唯一数据帧组合?

获取每行NumPy最大出现次数的所有值

达到最大的Python Webhost资源

如何更改GEKKO变量在解算为稳定状态后的MV状态?

如何在pandas DataFrame列中保持一个只增加的数字序列?

真正的Python散布函数

Pandas 具有多列和数据帧条件的功能

如何在Python中以一种安全的方式获取Git提交散列

如何reshape 极地数据帧?

为什么一些地块有网格线,而另一些地块没有网格线?

PyCharm调试器控制台不自动完成在调试器控制台中创建的变量