Pandas是否提供不依赖datetime索引的resample方法?如何对无时间索引的Series按固定块应用外部函数实现降采样?
解决Pandas Series固定大小分块应用自定义函数的问题
不用依赖datetime索引也能轻松实现你的需求,我平时处理这类固定大小分块的需求时,最常用下面这些高效且清晰的方案:
方案一:groupby + 整数除法(最推荐)
这是处理固定大小分块最直接的方式,核心思路是通过整数除法生成分组标签,把每N个元素归为一组:
import pandas as pd import numpy as np # 你的自定义函数(示例为求和) def myFunction(arr): return arr.sum() series = pd.Series([1,1,1,1,1,1,1,1,1]) # 生成分组标签:每3个元素一组 group_labels = np.arange(len(series)) // 3 # 分组并应用函数(转成ndarray传入自定义函数) result = series.groupby(group_labels).apply(lambda x: myFunction(x.values)) # 验证结果:result等于pd.Series([3,3,3]) print(result)
说明:
np.arange(len(series))生成和Series长度一致的连续整数数组,// 3做整数除法后,会得到[0,0,0,1,1,1,2,2,2]这样的分组标签,完美实现每3个元素一组。- 如果你的Series长度不是3的倍数,最后一组会自动包含剩余的元素(比如长度为10时,最后一组只有1个元素)。
- 因为
groupby.apply默认传入的是分组后的Series,所以用x.values把它转换成ndarray传给你的自定义函数,刚好匹配你的需求。
方案二:pd.cut生成分组标签
如果你想要更灵活的分组边界控制,可以用pd.cut来生成标签,原理和方案一类似:
bins = np.arange(0, len(series)+1, 3) group_labels = pd.cut(np.arange(len(series)), bins=bins, labels=False, include_lowest=True) result = series.groupby(group_labels).apply(lambda x: myFunction(x.values))
这个方法适合需要调整分组起始/结束位置的场景,但对于固定步长的分块,方案一更简洁高效。
要不要用临时datetime索引?
完全没必要!上面的方法既不需要额外的索引转换,代码逻辑也更清晰,运行效率也比临时创建datetime索引再resample要高,避免了索引转换可能带来的问题。
内容的提问来源于stack exchange,提问作者topher217
相关产品推荐
相关产品推荐

