Pandas Group/Merge Dataframe by Non-Periodic Series

Posted

技术标签:

【中文标题】Pandas Group/Merge Dataframe by Non-Periodic Series【英文标题】: 【发布时间】:2021-05-28 05:45:23 【问题描述】:

如何将一个 DataFrame 按另一个可能的非周期性系列分组?样机如下:

这是要拆分的DataFrame:

i = pd.date_range(end="today", periods=20, freq="d").normalize()
v = np.random.randint(0,100,size=len(i))
d = pd.DataFrame("value": v, index=i)
>>> d
            value
2021-02-06     48
2021-02-07      1
2021-02-08     86
2021-02-09     82
2021-02-10     40
2021-02-11     22
2021-02-12     63
2021-02-13     37
2021-02-14     41
2021-02-15     57
2021-02-16     30
2021-02-17     69
2021-02-18     63
2021-02-19     27
2021-02-20     23
2021-02-21     46
2021-02-22     66
2021-02-23     10
2021-02-24     91
2021-02-25     43

这是拆分标准,按系列日期分组。一个组由任何有序的数据帧值 v 组成,这样 v[s,s+1) 相交 - 但与重采样一样,控制包含参数会很好。

s = pd.date_range(start="2019-10-14", freq="2W", periods=52).to_series()
s = s.drop(np.random.choice(s.index, 10, replace=False))
s = s.reset_index(drop=True)
>>> s[25:29]
25   2021-01-24
26   2021-02-07
27   2021-02-21
28   2021-03-07
dtype: datetime64[ns]

这是示例输出......或类似的东西。索引取自系列而不是数据框。

>>> ???.sum()
            value
...
2021-01-24  47
2021-02-07  768
2021-02-21  334
...

在内部,组将具有以下结构:

...
2021-01-10
        sum:        0
2021-01-24
    2021-02-06     47
        sum:       47
2021-02-07
    2021-02-07     52
    2021-02-08     56
    2021-02-09     21
    2021-02-10     39
    2021-02-11     86
    2021-02-12     30
    2021-02-13     20
    2021-02-14     76
    2021-02-15     91
    2021-02-16     70
    2021-02-17     34
    2021-02-18     73
    2021-02-19     41
    2021-02-20     79
        sum:      768
2021-02-21
    2021-02-21     90
    2021-02-22     75
    2021-02-23     12
    2021-02-24     70
    2021-02-25     87
        sum:      334
2021-03-07
        sum:        0
...

【问题讨论】:

上一个示例中的数字是否正确?我想我知道你想做什么,但我没有准确地得到这些数字。 你是对的,必须再次运行它并返回一组不同的随机数。 @user19087 始终为可重复性设置种子... 【参考方案1】:

看起来你可以做到:

bucket = pd.cut(d.index, bins=s, label=s[:-1], right=False)

d.groupby(bucket).sum()

【讨论】:

并返回一个 DatetimeIndex:,r.index = pd.to_datetime(r.index)。除非有更好的方法?

以上是关于Pandas Group/Merge Dataframe by Non-Periodic Series的主要内容,如果未能解决你的问题,请参考以下文章

pandas Data

Pandas文摘:Applying Operations Over pandas Dataframes

Python/Pandas 遍历列

向 Pandas DataFrame 箱线图添加图例

Pandas 的整数索引重采样等价物

#yyds干货盘点#Pandas数据清洗实用指南