Получение всех групп при использовании pd.Grouper в Pandas - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть такой фрейм данных:

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'))])

Это мой самый первый вопрос здесь, поэтому, если я смогу сделать его лучше, пожалуйста, скажите мне, как.

1 Ответ

0 голосов
/ 24 апреля 2018

Мне это кажется ошибкой, потому что, если я распечатаю 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])}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...