来自日期时间范围的计算列和pandas中的组

时间:2014-08-30 16:12:22

标签: pandas

我想计算每组每周的最大值,并在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子句,然后将其附加到数据帧,但这会在系列中创建排序错误。

1 个答案:

答案 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}}的文档并尝试一些测试用例,以确保我能够正确地解释您想要的内容。