首页 > 解决方案 > 在 Pandas 中使用 pd.Grouper 时获取所有组

问题描述

我有一个这样的数据框:

zone  date         a    b
AL   2014-01-31   8.88  3286.6
AL   2014-01-31   0.61  1047.105
BS   2014-01-27   1.59  145.283
RF   2014-01-31   2.67  2842.35
RF   2014-01-31   3.4   0.26

我想按月份和区域分组

df.iloc[:, 1] = pd.to_datetime(df.iloc[:, 1])

g = df.groupby(['zone', pd.Grouper(key='date', freq='M')])

如果我使用pd.Grouper只有一个区域

>>> g.groups.keys()
dict_keys([('AL', Timestamp('2014-01-31 00:00:00'))])

如果我不使用pd.Grouper所有区域:

g = df.groupby('zone')

>>>> g.groups.keys()
dict_keys(['AL', 'BS', 'RF'])

我想按月对所有区域进行分组,以便结果类似于:

>>>> g.groups.keys()
dict_keys([('AL', Timestamp('2014-01-31 00:00:00')), 
           ('BS', Timestamp('2014-01-31 00:00:00')), 
           ('RF', Timestamp('2014-01-31 00:00:00'))])

这是我在这里的第一个问题,所以如果我能做得更好,请告诉我如何。

标签: pythonpandasgrouping

解决方案


这对我来说似乎是一个错误,因为如果我打印出来ngroups,它会显示 3:

g = df.groupby(['zone', pd.Grouper(key='date', freq='M')])
g.ngroups
3

此外,如果我迭代,我会得到所有组键g

[k for k, _ in g]    
[
 ('AL', Timestamp('2014-01-31 00:00:00', freq='M')),
 ('BS', Timestamp('2014-01-31 00:00:00', freq='M')),
 ('RF', Timestamp('2014-01-31 00:00:00', freq='M'))
]

另一个对我很有效的解决方案是g.indices

g.indices

{('AL', numpy.datetime64('2014-01-31T00:00:00.000000000')): array([0, 1]),
 ('BS', numpy.datetime64('2014-01-31T00:00:00.000000000')): array([2]),
 ('RF', numpy.datetime64('2014-01-31T00:00:00.000000000')): array([3, 4])}

推荐阅读