如何解决按列分组后的移动平均值
ExceptBy
以上是可用数据的快照。
我想要一个移动平均列,它根据日期而不是行给出 MA,即我在同一日期有多个条目的日子应该只有一个值作为 MA。
我希望 MA 在按原点的第一个分组上计算,然后在日期上计算。
以下是每个 Origin 组中缺失日期的脚本-
CargoTons DateOrigin DateDestination Origin Destination
0 72875.0 2020-01-01 2020-01-08 Snohvit Dragon
1 77126.0 2020-01-01 2020-01-16 Cameron (Liqu.) Grain
2 0 2020-01-02
3 67500.0 2020-01-03 2020-01-18 Sabine Pass South Hook
4 93843.0 2020-01-04 2020-01-23 Ras Laffan South Hook
5 76239.0 2020-01-05 2020-01-14 Yamal Grain
6 71749.0 2020-01-05 2020-01-23 Sabine Pass Dragon
7 75353.0 2020-01-06 2020-01-22 Sabine Pass South Hook
8 71749.0 2020-01-07 2020-01-21 Sabine Pass South Hook
9 0 2020-01-08
10 96925.0 2020-01-09 2020-01-25 Ras Laffan South Hook
11 65013.0 2020-01-10 2020-01-22 Snohvit Grain
12 76505.0 2020-01-10 2020-01-19 Yamal Dragon
13 0 2020-01-11
14 0 2020-01-12
15 0 2020-01-13
16 0 2020-01-14
17 0 2020-01-15
解决方法
模块:
import io
import pandas as pd
数据示例:
df = pd.read_csv(io.StringIO("""
CargoTons DateOrigin Origin
0 72875.0 2020-01-01 Snohvit
1 77126.0 2020-01-01 Cameron
2 0 2020-01-02
3 67500.0 2020-01-03 SabinePass
4 93843.0 2020-01-04 RasLaffan
5 76239.0 2020-01-05 Yamal
6 71749.0 2020-01-05 SabinePass
7 75353.0 2020-01-06 SabinePass
8 71749.0 2020-01-07 SabinePass
9 0 2020-01-08
10 96925.0 2020-01-09 RasLaffan
11 65013.0 2020-01-10 Snohvit
12 76505.0 2020-01-10 Yamal
13 0 2020-01-11
14 0 2020-01-12
15 0 2020-01-13
16 0 2020-01-14
17 0 2020-01-15
"""),sep="\s",engine="python")
您可以在 Origin 和 DateOrigin 上使用 groupby
,首先计算同一日期不同值的平均值。
ndf = pd.DataFrame(df.groupby(['Origin','DateOrigin']).aggregate('CargoTons').mean()).reset_index()
然后使用rolling
,例如mean on a window of 2。以Origin
为groupby。
ndf.groupby(['Origin']).rolling(2).mean()
给出:
CargoTons
Origin
Cameron 0 NaN
RasLaffan 1 NaN
2 95384.0
SabinePass 3 NaN
4 69624.5
5 73551.0
6 73551.0
Snohvit 7 NaN
8 68944.0
Yamal 9 NaN
10 76372.0
验证
如您所见,在 Origin
的每个类别中,它都以 NAN 开头,这是由于滚动窗口而在意料之中的。例如的输出。 Snohvit 68944.0 是其输入的平均值,(72875+65013)/2。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。