提问人:Michael W 提问时间:11/14/2023 更新时间:11/14/2023 访问量:39
多索引数据透视表的 Pandas 减法
Pandas subtraction for multiindex pivot table
问:
我有一个以下数据框,我将其转换为具有两个索引的 pandas 数据透视表“Date”和“Rating”。 这些值在 A、B 和 C 列中排序。
我想找到一个解决方案,该解决方案将减去连续几天的每列和评级的值。假设评级 M 从 2007 年 3 月 1 日到 2007 年 2 月 1 日的 A 变化为 。减法并不总是在一天的差值上执行。但它将永远是(新日期 - 旧日期)。0.4179 - 0.4256 = -0.0077
我正在寻找的结果可以在下表中找到:
答:
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
上一个:整理数据透视表中的多列
评论
df.sort_values('Date').groupby('Rating')[['A', 'B', 'C']].diff().fillna(0)