Pandas 对具有固定行数的数据帧进行重新采样

2024-03-27

With pandas.DataFrame.resample https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.resample.html我可以将 DataFrame 下采样到特定的持续时间:

df.resample("3s").mean()

但是,我不想指定某个时间,而是指定原始数据框中的固定行数,例如“重新采样,使得之前的三行现在聚合为一行”。这在熊猫身上怎么可能呢?


可能有点晚了,但这是我为每个寻求解决此问题的人提供的答案。

一种解决方案是使用 pandas滚动(n) https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rolling.html滑动窗口功能,然后选择每个第 n 个值。例如。对于 n=3

df_sub = df.rolling(3).mean()[::3]

这对于计算来说有点浪费,因为您重新计算整个数据帧,然后只保留其中的 1/n%。

另一种类似的解决问题的方法是使用 numpy 的方法,即不计算平均值,而是按列插值整个数据帧interp1 https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.interp.html功能。

例如:假设您有一个 DataFrame,其中索引是单调递增的数值/时间戳值(通常与时间序列数据一样),并且您想要单独调整每一列,您可以这样做:

def resample_fixed(df, n_new):
    n_old, m = df.values.shape
    mat_old = df.values
    mat_new = np.zeros((n_new, m))
    x_old = np.linspace(df.index.min(), df.index.max(), n_old)
    x_new = np.linspace(df.index.min(), df.index.max(), n_new)

    for j in range(m):
        y_old = mat_old[:, j]
        y_new = np.interp(x_new, x_old, y_old)
        mat_new[:, j] = y_new

    return pd.DataFrame(mat_new, index=x_new, columns=df.columns)

但要小心, interp1 确实会改变您的数据,因为它线性插值您的数据点。我建议检查插值后的结果。

您可以在我为此所做的要点文件中找到有关插值的完整示例here https://gist.github.com/TobiasGlaubach/68298acdd637860f115c83ff439ac8b7.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pandas 对具有固定行数的数据帧进行重新采样 的相关文章

随机推荐