首页 > 解决方案 > Pandas 是否有不依赖于日期时间索引的重采样方法?

问题描述

我有一个系列,我想在三个子集/块中应用一个外部函数。尽管实际的外部函数更复杂,但为了举例,让我们假设我的外部函数采用整数的 ndarray 并返回所有值的总和。例如:

series = pd.Series([1,1,1,1,1,1,1,1,1])
# Some pandas magic similar to:
result = series.resample(3).apply(myFunction)
# where 3 just represents every 3 values and
# result == pd.Series([3,3,3])

正如上面的伪代码所暗示的那样,我查看了将Series.resampleSeries.apply结合起来,但它似乎resample取决于日期时间索引。关于如何通过在没有日期时间索引的情况下应用这样的外部函数来有效地进行下采样的任何想法?还是您只是建议创建一个临时日期时间索引来执行此操作,然后恢复到原始索引?

标签: pandas

解决方案


pandas.DataFrame.groupby可以在这里解决问题。您需要的是一个重复索引来指定子集/块

创建块

n = 3
repeat_idx = np.repeat(np.arange(0,len(series), n), n)[:len(series)]
print(repeat_idx)

array([0, 0, 0, 3, 3, 3, 6, 6, 6])

通过...分组

def myFunction(l):
    output = 0
    for item in l:
        output+=item
    return output
series = pd.Series([1,1,1,1,1,1,1,1,1])

result = series.groupby(repeat_idx).apply(myFunction)
(result)

0    3
3    3
6    3

该解决方案也适用于不增加系列长度的块,

n = 4
repeat_idx = np.repeat(np.arange(0,len(series), n), n)[:len(series)]

print(repeat_idx)
array([0, 0, 0, 0, 4, 4, 4, 4, 8])

result = series.groupby(repeat_idx).apply(myFunction)
print(result)

0    4
4    4
8    1

推荐阅读