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

Popular posts from this blog

sublimetext3 - what keyboard shortcut is to comment/uncomment for this script tag in sublime -

java - No use of nillable="0" in SOAP Webservice -

ubuntu - Laravel 5.2 quickstart guide gives Not Found Error -