我想计算每组每周的最大值,并在pandas中创建一个包含这些值的新列。我posted一个类似的问题没有解决我的问题,所以我重新组织了这个问题。
考虑具有时间戳,组和值列的数据框:
datetime group value
2014-05-07 A 3
2014-05-07 B 4
2014-05-14 A 4
2014-05-14 B 2
2014-05-15 A 6
2014-05-15 B 4
2014-05-16 A 7
2014-05-16 B 10
我想按组创建一个每周最大值的新列:
datetime group value maxval
2014-05-07 A 3 3
2014-05-07 B 4 4
2014-05-14 A 4 7
2014-05-14 B 2 10
2014-05-15 A 6 7
2014-05-15 B 4 10
2014-05-16 A 7 7
2014-05-16 B 10 10
在链接的问题中,提出的解决方案是转换groupby子句,然后将其附加到数据帧,但这会在系列中创建排序错误。
答案 0 :(得分:2)
您可以transform
同时在group
和同一周内编入索引的>>> week = pd.DatetimeIndex(df.datetime).week
>>> df["maxval"] = df.groupby(['group', week])["value"].transform('max')
>>> df
datetime group value maxval
0 2014-05-07 A 3 3
1 2014-05-07 B 4 4
2 2014-05-14 A 4 7
3 2014-05-14 B 2 10
4 2014-05-15 A 6 7
5 2014-05-15 B 4 10
6 2014-05-16 A 7 7
7 2014-05-16 B 10 10
组:
rolling_max
请注意,如果您有多年,则会将每年的第二周(例如)合并到同一组中。
有时人们想要这样,但如果你不这样做,你可以用同样的方式将年份添加到分组数量中。
如果你想要一个滚动的最大值,你可以使用(足够恰当)rolling_max
。您可以自行重新取样或让def rolling_max_week(x):
rolled = pd.rolling_max(x, 7, min_periods=1, center=True, freq='d')
match_x = rolled.loc[x.index]
return match_x
df["datetime"] = pd.to_datetime(df["datetime"])
df = df.set_index("datetime")
df["rolling_max"] = df.groupby("group")["value"].transform(rolling_max_week)
df["bin_max"] = df.groupby(["group", df.index.week])["value"].transform(max)
执行此操作,例如
>>> df
group value rolling_max bin_max
datetime
2014-05-07 A 3 3 3
2014-05-07 B 4 4 4
2014-05-14 A 4 7 7
2014-05-14 B 2 10 10
2014-05-15 A 6 7 7
2014-05-15 B 4 10 10
2014-05-16 A 7 7 7
2014-05-16 B 10 10 10
现在碰巧,这两个产品在您的样品上产生完全相同的输出:
rolling_max
但总的来说这不是真的。您需要阅读{{1}}的文档并尝试一些测试用例,以确保我能够正确地解释您想要的内容。