我有一个以下数据框,我将其转换为具有两个索引“日期”和“评级”的 pandas 数据透视表。 这些值按 A、B 和 C 列排序。
我想找到一个解决方案,减去每列的值和连续天的评级。假设,从 03/01/2007 到 02/01/2007,评级 M 的 A 变化将是
0.4179 - 0.4256 = -0.0077
。减法并不总是针对一天的差异进行。但它永远是(新日期 - 旧日期)。
我正在寻找的结果可以在下表中找到:
如果您的数据框已正确排序(或使用
df.sort_values('Date')
),您可以使用groupby_diff
:
# Replace ['A'] with ['A', 'B', 'C']
df['A_diff'] = df.groupby('Rating')['A'].diff().fillna(0)
输出:
>>> df
Date Rating A A_diff
0 02/01/2007 M 0.4256 0.0000
1 02/01/2007 MM 0.4358 0.0000
2 02/01/2007 MMM 0.4471 0.0000
3 03/01/2007 M 0.4179 -0.0077
4 03/01/2007 MM 0.4325 -0.0033
5 03/01/2007 MMM 0.4476 0.0005
6 04/01/2007 M 0.4173 -0.0006
7 04/01/2007 MM 0.4316 -0.0009
8 04/01/2007 MMM 0.4469 -0.0007
如果您不知道自己有多少列,您可以尝试:
cols = df.columns[2:]
df[cols] = df.groupby('Rating')[cols].diff().fillna(0)