多索引数据透视表的 Pandas 减法

Pandas subtraction for multiindex pivot table

提问人:Michael W 提问时间:11/14/2023 更新时间:11/14/2023 访问量:39

问:

我有一个以下数据框,我将其转换为具有两个索引的 pandas 数据透视表“Date”和“Rating”。 这些值在 A、B 和 C 列中排序。

Pivot data

我想找到一个解决方案,该解决方案将减去连续几天的每列和评级的值。假设评级 M 从 2007 年 3 月 1 日到 2007 年 2 月 1 日的 A 变化为 。减法并不总是在一天的差值上执行。但它将永远是(新日期 - 旧日期)。0.4179 - 0.4256 = -0.0077

我正在寻找的结果可以在下表中找到:

enter image description here

Python Pandas 帧数据 透视表

评论

2赞 Corralien 11/14/2023
你试过了吗?df.sort_values('Date').groupby('Rating')[['A', 'B', 'C']].diff().fillna(0)
0赞 Michael W 11/14/2023
不,老实说不知道为什么。谢谢!简单而美丽。工作完美,我以前一直在与“for”循环作斗争。

答:

2赞 Corralien 11/14/2023 #1

如果 DataFrame 已正确排序(或使用),则可以使用: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)

评论

0赞 Michael W 11/14/2023
完善。如果我对列号进行修改,该怎么办?比如说,我不知道会有多少列。它可能只是“A”、“B”或“A”、“B”、“C”、“D”,我不想每次都手动更改它。
1赞 Corralien 11/14/2023
尝试用代替 .df.columns[2:]A