我有一个MultiIndex
(id, date)
的df,我想做两件事:
将名为DateTimeIndex
的{{1}}转换为每个date
组中的PeriodIndex
id
每日resample
每月的频率
我当前的(非工作)方法是(甚至在转换为PeriodIndex
之前):
PeriodIndex
这引起了:
df = pd.DataFrame(data = {"val": np.arange(30),
"id": np.tile([1,2], 15),
"date": np.repeat(pd.date_range(start = "2000-01-01", periods = 15, name="date"), 2)
})
df = df.set_index(["id", "date"]).sort_index()
df.groupby("id")["val"].resample(rule = "M", closed = "right", label = "right").apply(lambda x: np.sqrt(sum(x)/10))
完成整个程序的正确方法是什么?我对如何考虑TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'MultiIndex'
感到困惑:我的心理模型是groupby
操作后的任何内容都只会收到与该组相对应的子帧(即groupby
成为该特定组中仅MultiIndex
的单个索引。这不正确吗?
答案 0 :(得分:2)
如果在DatetimeIndex
之前设置groupby
是必要apply
,则resample
也不是必需的,sum
Series
的速度更快,然后划分最终np.sqrt
乘以10,然后使用df = df.set_index(["date"]).sort_index()
df1 = (np.sqrt(df.groupby("id")["val"]
.resample(rule = "M", closed = "right", label = "right")
.sum()
.div(10)))
print (df1)
id date
1 2000-01-31 4.582576
2 2000-01-31 4.743416
Name: val, dtype: float64
:
{{1}}