python - Groupby on categorical column with date and period producing unexpected result -
the issue below created in python 2.7.11 pandas 0.17.1
when grouping categorical column both period , date column, unexpected rows appear in grouping. pandas bug, or else?
df = pd.dataframe({'date': pd.date_range('2015-12-29', '2016-1-3'), 'val1': [1] * 6, 'val2': range(6), 'cat1': ['a', 'b', 'c'] * 2, 'cat2': ['a', 'b', 'c'] * 2}) df['cat1'] = df.cat1.astype('category') df['month'] = [d.to_period('m') d in df.date] >>> df cat1 cat2 date val1 val2 month 0 2015-12-29 1 0 2015-12 1 b b 2015-12-30 1 1 2015-12 2 c c 2015-12-31 1 2 2015-12 3 2016-01-01 1 3 2016-01 4 b b 2016-01-02 1 4 2016-01 5 c c 2016-01-03 1 5 2016-01
grouping month , date regular series (e.g. cat2
) works expected:
>>> df.groupby(['month', 'date', 'cat2']).sum().unstack() val1 val2 cat2 b c b c month date 2015-12 2015-12-29 1 nan nan 0 nan nan 2015-12-30 nan 1 nan nan 1 nan 2015-12-31 nan nan 1 nan nan 2 2016-01 2016-01-01 1 nan nan 3 nan nan 2016-01-02 nan 1 nan nan 4 nan 2016-01-03 nan nan 1 nan nan 5
but grouping on categorical produces unexpected results. you'll notice in index dates not correspond grouped month.
>>> df.groupby(['month', 'date', 'cat1']).sum().unstack() val1 val2 cat1 b c b c month date 2015-12 2015-12-29 1 nan nan 0 nan nan 2015-12-30 nan 1 nan nan 1 nan 2015-12-31 nan nan 1 nan nan 2 2016-01-01 nan nan nan nan nan nan # <<< extraneous row. 2016-01-02 nan nan nan nan nan nan # <<< extraneous row. 2016-01-03 nan nan nan nan nan nan # <<< extraneous row. 2016-01 2015-12-29 nan nan nan nan nan nan # <<< extraneous row. 2015-12-30 nan nan nan nan nan nan # <<< extraneous row. 2015-12-31 nan nan nan nan nan nan # <<< extraneous row. 2016-01-01 1 nan nan 3 nan nan 2016-01-02 nan 1 nan nan 4 nan 2016-01-03 nan nan 1 nan nan 5
grouping categorical month periods or dates works fine, not when both combined in example above.
>>> df.groupby(['month', 'cat1']).sum().unstack() val1 val2 cat1 b c b c month 2015-12 1 1 1 0 1 2 2016-01 1 1 1 3 4 5 >>> df.groupby(['date', 'cat1']).sum().unstack() val1 val2 cat1 b c b c date 2015-12-29 1 nan nan 0 nan nan 2015-12-30 nan 1 nan nan 1 nan 2015-12-31 nan nan 1 nan nan 2 2016-01-01 1 nan nan 3 nan nan 2016-01-02 nan 1 nan nan 4 nan 2016-01-03 nan nan 1 nan nan 5
edit behavior originated in 0.15.0 update. prior that, output:
>>> df.groupby(['month', 'date', 'cat1']).sum().unstack() val1 val2 cat1 b c b c month date 2015-12 2015-12-29 1 nan nan 0 nan nan 2015-12-30 nan 1 nan nan 1 nan 2015-12-31 nan nan 1 nan nan 2 2016-01 2016-01-01 1 nan nan 3 nan nan 2016-01-02 nan 1 nan nan 4 nan 2016-01-03 nan nan 1 nan nan 5
as defined in pandas, grouping categorical have full set of categories, if there isn't data category, e.g., doc example here
you can either not use categorical, or add .dropna(how='all')
after grouping step.
Comments
Post a Comment