pandas.Grouper#
- class pandas.Grouper(*args, **kwargs)[源代码][源代码]#
Grouper 允许用户为对象指定一个 groupby 指令。
此规范将通过键参数选择一列,或者如果给定了级别参数,则选择目标对象索引的一个级别。
如果
level
作为关键字传递给 Grouper 和 groupby,传递给 Grouper 的值优先。- 参数:
- *args
当前未使用,保留供将来使用。
- **kwargs
传递给 Grouper 的关键字参数的字典。
属性
关键
(str, 默认为 None) Groupby 键,它选择目标的分组列。
级别
(名称/编号,默认为无) 目标索引的级别。
freq
(str / 频率对象, 默认为 None) 如果目标选择(通过键或级别)是类似日期时间的对象,这将按指定频率进行分组。有关可用频率的完整规范,请参见 这里。
排序
(布尔值,默认为 False)是否对生成的标签进行排序。
关闭
({‘left’ or ‘right’}) 区间的闭端。仅当传递 freq 参数时。
标签
({‘左’ 或 ‘右’}) 用于标记的区间边界。仅当传递 freq 参数时。
惯例
({‘start’, ‘end’, ‘e’, ‘s’}) 如果 grouper 是 PeriodIndex 并且传递了 freq 参数。
origin
(时间戳或字符串,默认 ‘start_day’) 用于调整分组的时间戳。原时区必须与索引时区匹配。如果是字符串,必须是以下之一: - ‘epoch’: origin 是 1970-01-01 - ‘start’: origin 是时间序列的第一个值 - ‘start_day’: origin 是时间序列第一个午夜 - ‘end’: origin 是时间序列的最后一个值 - ‘end_day’: origin 是最后一天的午夜上限 .. versionadded:: 1.3.0
偏移
(Timedelta 或 str, 默认是 None) 一个添加到原点的偏移时间增量。
dropna
(bool, 默认 True) 如果为 True,并且如果组键包含 NA 值,则 NA 值连同行/列将被删除。如果为 False,NA 值也将被视为组中的键。
- 返回:
- Grouper 或 pandas.api.typing.TimeGrouper
如果
freq
不是None
,则返回一个 TimeGrouper。否则,返回一个 Grouper。
参见
Series.groupby
对一个Series应用一个groupby函数。
DataFrame.groupby
应用一个函数 groupby。
例子
df.groupby(pd.Grouper(key="Animal"))
等同于df.groupby('Animal')
>>> df = pd.DataFrame( ... { ... "Animal": ["Falcon", "Parrot", "Falcon", "Falcon", "Parrot"], ... "Speed": [100, 5, 200, 300, 15], ... } ... ) >>> df Animal Speed 0 Falcon 100 1 Parrot 5 2 Falcon 200 3 Falcon 300 4 Parrot 15 >>> df.groupby(pd.Grouper(key="Animal")).mean() Speed Animal Falcon 200.0 Parrot 10.0
在列 ‘Publish date’ 上指定一个重采样操作
>>> df = pd.DataFrame( ... { ... "Publish date": [ ... pd.Timestamp("2000-01-02"), ... pd.Timestamp("2000-01-02"), ... pd.Timestamp("2000-01-09"), ... pd.Timestamp("2000-01-16"), ... ], ... "ID": [0, 1, 2, 3], ... "Price": [10, 20, 30, 40], ... } ... ) >>> df Publish date ID Price 0 2000-01-02 0 10 1 2000-01-02 1 20 2 2000-01-09 2 30 3 2000-01-16 3 40 >>> df.groupby(pd.Grouper(key="Publish date", freq="1W")).mean() ID Price Publish date 2000-01-02 0.5 15.0 2000-01-09 2.0 30.0 2000-01-16 3.0 40.0
如果你想根据一个固定的时间戳调整分箱的开始:
>>> start, end = "2000-10-01 23:30:00", "2000-10-02 00:30:00" >>> rng = pd.date_range(start, end, freq="7min") >>> ts = pd.Series(np.arange(len(rng)) * 3, index=rng) >>> ts 2000-10-01 23:30:00 0 2000-10-01 23:37:00 3 2000-10-01 23:44:00 6 2000-10-01 23:51:00 9 2000-10-01 23:58:00 12 2000-10-02 00:05:00 15 2000-10-02 00:12:00 18 2000-10-02 00:19:00 21 2000-10-02 00:26:00 24 Freq: 7min, dtype: int64
>>> ts.groupby(pd.Grouper(freq="17min")).sum() 2000-10-01 23:14:00 0 2000-10-01 23:31:00 9 2000-10-01 23:48:00 21 2000-10-02 00:05:00 54 2000-10-02 00:22:00 24 Freq: 17min, dtype: int64
>>> ts.groupby(pd.Grouper(freq="17min", origin="epoch")).sum() 2000-10-01 23:18:00 0 2000-10-01 23:35:00 18 2000-10-01 23:52:00 27 2000-10-02 00:09:00 39 2000-10-02 00:26:00 24 Freq: 17min, dtype: int64
>>> ts.groupby(pd.Grouper(freq="17min", origin="2000-01-01")).sum() 2000-10-01 23:24:00 3 2000-10-01 23:41:00 15 2000-10-01 23:58:00 45 2000-10-02 00:15:00 45 Freq: 17min, dtype: int64
如果你想用 offset Timedelta 调整 bin 的开始,以下两行是等效的:
>>> ts.groupby(pd.Grouper(freq="17min", origin="start")).sum() 2000-10-01 23:30:00 9 2000-10-01 23:47:00 21 2000-10-02 00:04:00 54 2000-10-02 00:21:00 24 Freq: 17min, dtype: int64
>>> ts.groupby(pd.Grouper(freq="17min", offset="23h30min")).sum() 2000-10-01 23:30:00 9 2000-10-01 23:47:00 21 2000-10-02 00:04:00 54 2000-10-02 00:21:00 24 Freq: 17min, dtype: int64
要替换已弃用的 base 参数,你现在可以使用 offset,在这个例子中,它等同于 base=2:
>>> ts.groupby(pd.Grouper(freq="17min", offset="2min")).sum() 2000-10-01 23:16:00 0 2000-10-01 23:33:00 9 2000-10-01 23:50:00 36 2000-10-02 00:07:00 39 2000-10-02 00:24:00 24 Freq: 17min, dtype: int64