python - pandas Grouper 未按预期进行上采样
问题描述
考虑一个具有 MultiIndex 的系列,它在级别 0 上提供自然分组值,在级别 1 上提供时间序列:
s = pd.Series(range(12), index=pd.MultiIndex.from_product([['a','b','c'],
pd.date_range(start='2019-01-01', freq='3D', periods=4)], names=['grp','ts']))
print(s)
grp ts
a 2019-01-01 0
2019-01-04 1
2019-01-07 2
2019-01-10 3
b 2019-01-01 4
2019-01-04 5
2019-01-07 6
2019-01-10 7
c 2019-01-01 8
2019-01-04 9
2019-01-07 10
2019-01-10 11
Length: 12, dtype: int64
我想对每个外部索引值的时间序列进行上采样,例如使用简单的前向填充操作:
s.groupby(['grp', pd.Grouper(level=1, freq='D')]).ffill()
这会产生意想不到的结果;也就是说,它什么也不做。结果正是s
我想要的,而不是我想要的:
grp ts
a 2019-01-01 0
2019-01-02 0
2019-01-03 0
2019-01-04 1
2019-01-05 1
2019-01-06 1
2019-01-07 2
2019-01-08 2
2019-01-09 2
2019-01-10 3
b 2019-01-01 4
2019-01-02 4
2019-01-03 4
2019-01-04 5
2019-01-05 5
2019-01-06 5
2019-01-07 6
2019-01-08 6
2019-01-09 6
2019-01-10 7
c 2019-01-01 8
2019-01-02 8
2019-01-03 8
2019-01-04 9
2019-01-05 9
2019-01-06 9
2019-01-07 10
2019-01-08 10
2019-01-09 10
2019-01-10 11
Length: 30, dtype: int64
我可以将 Grouper freq 或 resample 函数更改为相同的效果。我发现的一种解决方法是通过创造性的技巧在每个组上强制一个简单的时间序列索引(感谢 Allen 提供答案https://stackoverflow.com/a/44719843/3109201):
s.reset_index(level=1).groupby('grp').apply(lambda s: s.set_index('ts').resample('D').ffill())
这与我最初要求的略有不同,因为它返回一个 DataFrame:
0
grp ts
a 2019-01-01 0
2019-01-02 0
2019-01-03 0
2019-01-04 1
2019-01-05 1
2019-01-06 1
2019-01-07 2
2019-01-08 2
2019-01-09 2
2019-01-10 3
b 2019-01-01 4
2019-01-02 4
2019-01-03 4
2019-01-04 5
2019-01-05 5
2019-01-06 5
2019-01-07 6
2019-01-08 6
2019-01-09 6
2019-01-10 7
c 2019-01-01 8
2019-01-02 8
2019-01-03 8
2019-01-04 9
2019-01-05 9
2019-01-06 9
2019-01-07 10
2019-01-08 10
2019-01-09 10
2019-01-10 11
[30 rows x 1 columns]
我可以并且将使用这种解决方法,但我想知道为什么更简单(坦率地说更优雅)的方法不起作用。
解决方案
使用series.asfreq()
它来满足缺失的日期。
def filldates(s_in):
s_in.reset_index(level="grp",drop=True,inplace=True)
s_in= s_in.asfreq("1D",method='ffill')
return s_in
s.groupby(level=0).apply(filldates)
推荐阅读
- discord.js - 更改语音通道服务器区域不和谐 js
- kubernetes - 来自我们的 AKS 集群的间歇性响应;怀疑负载均衡器问题
- java - Eclipse Javafx 可运行 Jar
- sql - 寻找返回传递参数的最佳方法,以允许我在 SQL 中返回特定客户或所有客户
- html-email - 将带有链接的 HTML 电子邮件直接发送回应用程序,我们如何禁用以便“预览”或扫描不会点击这些链接?
- ruby-on-rails - graphql过滤单元测试
- javascript - 如何使输入->值->类型->搜索动态?
- javascript - 将文件的base64值发送到api
- regex - RegEx中的具体位置
- javascript - Promises/A+ 规范和 ECMAScript 承诺之间可能存在矛盾?