使用pandas.DataFrame.resample我可以将 DataFrame 下采样到特定的持续时间:
df.resample("3s").mean()
Run Code Online (Sandbox Code Playgroud)
但是,我不想指定某个时间,而是指定原始数据框中固定数量的行,例如“重新采样,使以前的三行现在聚合为一”。这在大熊猫中怎么可能?
可能有点晚了,但这是我为每个寻求解决此问题的人提供的答案。
一种解决方案是使用 pandasrolling (n)滑动窗口功能,然后选择每个第 n 个值。eG,n=3
df_sub = df.rolling(3).mean()[::3]
Run Code Online (Sandbox Code Playgroud)
这对于计算来说有点浪费,因为您重新计算整个数据帧,然后只保留其中的 1/n%。
解决该问题的另一种类似方法是使用 numpy 的interp1函数,它不是计算平均值,而是按列插值整个数据帧。
eG:假设您有一个 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)
Run Code Online (Sandbox Code Playgroud)
但要小心, interp1 确实会改变您的数据,因为它线性插值您的数据点。我建议检查插值后的结果。
您可以在我为此所做的要点文件中找到有关插值的完整示例。
| 归档时间: |
|
| 查看次数: |
3234 次 |
| 最近记录: |