我目前正在处理时间序列数据,并希望计算天数之间的差异。这必须针对给定维度的所有实例单独发生。这是一个示例数据框:
import pandas as pd
df = pd.DataFrame({"date": pd.to_datetime(["2017-01-01", "2017-01-01", "2017-01-02", "2017-01-02", "2017-01-03", "2017-01-03", "2017-01-04", "2017-01-04"]),
"dim_1": [0, 1, 0, 1, 0, 1, 0, 1],
"value": [50, 100, 70, 120, 150, 110, 130, 200]})
对于每个日期,dim_1组合都有价值。现在我提出了以下解决方案:
df.set_index("date").groupby(["dim_1"])\
.apply(lambda x: x["value"] - x["value"].shift())
导致:
date 2017-01-01 2017-01-02 2017-01-03 2017-01-04
dim_1
0 NaN 20.0 80.0 -20.0
1 NaN 20.0 -10.0 90.0
现在我必须融合数据框才能获得预期的结果:
pd.melt(df.set_index("date").groupby(["dim_1"])\
.apply(lambda x: x["value"] - x["value"].shift()).reset_index(),
["dim_1"])
导致:
dim_1 date value
0 0 2017-01-01 NaN
1 1 2017-01-01 NaN
2 0 2017-01-02 20.0
3 1 2017-01-02 20.0
4 0 2017-01-03 80.0
5 1 2017-01-03 -10.0
6 0 2017-01-04 -20.0
7 1 2017-01-04 90.0
当我按多个维度进行分组时,不会出现此问题。
我认为有一种更简单的方法可以实现这一结果,但我目前无法找到它。
非常感谢您提前!
答案 0 :(得分:1)
您可以使用Groupby.diff()
作为更好的选择,而不是通过使用apply
移动索引轴来计算差异,结果效率会降低。
df.assign(value=df.groupby("dim_1")['value'].diff())