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

时间:2017-06-01 11:02:41

标签: python pandas

使用pandas.DataFrame.resample我可以将DataFrame缩减为特定的持续时间:

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

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

1 个答案:

答案 0 :(得分:1)

可能有点晚了,但这是我为所有寻求解决此问题的方法的人的答案。

一种解决方案是使用熊猫rolling(n)滑动窗口功能,然后选择第n个值。例如。对于n = 3

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

这对于计算来说有点浪费,因为您要重新计算整个数据帧,然后只保留其百分之一/ n。

解决该问题的另一种类似方法是,不计算均值,而是明智地使用numpy的interp1函数对整个数据框进行插值。

e.G .:假设您有一个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做的要点文件中找到有关插值的完整示例。