首页 > 解决方案 > Pandas 根据其他列的值移动列数据

问题描述

我有一个看起来像这样的数据框:

    epochseconds  midPrice  midPrice_1
0     1570780800  2954.625         NaN
1     1570780800  2954.625         NaN
2     1570780800  2954.625         NaN
3     1570780800  2954.625         NaN
4     1570780800  2954.625         NaN
5     1570780800  2954.625         NaN
6     1570780800  2954.875         NaN
7     1570780800  2954.875         NaN

    epochseconds  midPrice  midPrice_1
24    1570780801  2954.875         NaN
25    1570780801  2954.875         NaN
26    1570780801  2954.875         NaN
27    1570780801  2954.875         NaN
28    1570780801  2954.875         NaN
29    1570780801  2954.875         NaN
30    1570780801  2954.875         NaN
31    1570780801  2955.000         NaN

每个纪元秒都有不同数量的观察。我想在 epochsecond+1 预测下一个 midprice。我想应用 pandas.DataFrame.shift,但这并没有考虑到我每秒都有不同的观察结果。有没有办法取 epochsecond:1570780801 的平均值并将其应用于 epochsecond:1570780800 的所有观测值。我总共有 868471 秒,所以这段代码应该应用于所有观察。

有人知道怎么做这个吗?

标签: pythonpandasdataframe

解决方案


欢迎来到堆栈溢出。

您可以使用函数计算相同历元秒的所有观测值的平均值groupby,然后是shift(移动-1,因为您希望将当前历元秒的平均值应用于前一个历元秒)。

然后,您对原始数据框进行左连接。

df_mean_shifted = df.groupby('epochseconds')['midPrice'].mean().shift(-1).rename('midPrice_1')

df.merge(df_mean_shifted, left_on='epochseconds', right_index=True)

这会给你你想要的,但你必须决定如何填写最后一个纪元的条目,这将是空的(因为shift)。

    epochseconds    midPrice    midPrice_1
0   1570780800      2954.625    2954.890625
1   1570780800      2954.625    2954.890625
2   1570780800      2954.625    2954.890625
3   1570780800      2954.625    2954.890625
4   1570780800      2954.625    2954.890625
5   1570780800      2954.625    2954.890625
6   1570780800      2954.875    2954.890625
7   1570780800      2954.875    2954.890625
24  1570780801      2954.875        
25  1570780801      2954.875        
26  1570780801      2954.875        
27  1570780801      2954.875        
28  1570780801      2954.875        
29  1570780801      2954.875        
30  1570780801      2954.875        
31  1570780801      2955.0      


推荐阅读