Серии групп панд с одной группой - PullRequest
2 голосов
/ 12 марта 2019

Введите:

import pandas as pd
data = pd.DataFrame(data={'date':[pd.Timestamp('2016-02-15')]*3, 
    'time':[pd.Timedelta(x) for x in ('07:30:00','10:10:00','11:10:00')],'name':['A']*3, 'N':[1,2,3]}
).set_index(['date','time','name']).sort_index()
data = data[ data.index.get_level_values('time')>=pd.to_timedelta('09:30:00') ]
dataGB = data['N'].groupby(['date','name'])
print(data)
print('Number of groups:',len(dataGB))
print(dataGB.sum())
print(pd.__version__)

Выход:

>>> print(data)
                          N
date       time     name   
2016-02-15 10:10:00 A     2
           11:10:00 A     3
>>> print('Number of groups:',len(dataGB))
Number of groups: 2
>>> print(dataGB.sum())
date    2
name    3
Name: N, dtype: int64
>>> print(pd.__version__)
0.24.1

Вопросы:

  1. Почему я получаю 2 группы, в то время как явно должна быть только одна?
  2. Почему я получаю мусор из dataGB.sum() и что делать, чтобы получить ожидаемый (ниже) результат?

Ожидаемый результат dataGB.sum():

>>> dataGB.sum()
date        name
2016-02-15  A       5
Name: N, dtype: int64

Спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 12 марта 2019

Это может быть ошибка с pd.Series.groupby, я отправлю отчет об ошибке в пандах для этого случая.

Обойти # 1 использовать pd.DataFrame вместо pd.Series

data[['N']].groupby(['date','name']).sum()

Выход:

                 N
date       name   
2016-02-15 A     5

Work Around # 2 используйте параметр уровня в groupby

data['N'].groupby(level=[0,2]).sum()

Выход:

date        name
2016-02-15  A       5
Name: N, dtype: int64

Обойти # 3 использовать фрейм данных со столбцом агрегатора:

 data.groupby(['date', 'name'])['N'].sum()

Выход:

date        name
2016-02-15  A       5
Name: N, dtype: int64
1 голос
/ 12 марта 2019

Согласно этому сообщению, Python Pandas - как группировать по мультииндексу , группировка по мультииндексу должна выполняться следующим образом

dataGB = data['N'].groupby(level=[0,2]) 
...