6.27. DataFrame MultiIndex

6.27.1. SetUp

>>> import pandas as pd
>>>
>>> pd.set_option('display.max_columns', 20)
>>> pd.set_option('display.width', 1000)
>>>
>>>
>>> DATA = 'https://python3.info/_static/phones-pl.csv'
>>> df = (
...     pd
...     .read_csv(DATA, parse_dates=['datetime'])
...     .groupby(['period', 'item']).agg(
...         duration_count=('duration', 'count'),
...         duration_mean=('duration', 'mean'),
...         duration_min=('duration', 'min'),
...         duration_q25=('duration', lambda s: s.quantile(.25)),
...         duration_q50=('duration', lambda s: s.quantile(.50)),
...         duration_q75=('duration', lambda s: s.quantile(.75)),
...         duration_max=('duration', 'max'),
...         duration_std=('duration', 'std'),
...         duration_sum=('duration', 'sum'),
...         datetime_first=('datetime', 'first'),
...         datetime_last=('datetime', 'last'),
...         datetime_days=('datetime', lambda s: (max(s) - min(s)).days),
...     )
...     .round({'duration_mean': 1, 'duration_std': 1})
... )
>>>
>>> df
              duration_count  duration_mean  duration_min  duration_q25  duration_q50  duration_q75  duration_max  duration_std  duration_sum      datetime_first       datetime_last  datetime_days
period  item
1999-11 call             107          238.8           1.0           5.5          48.0         328.0        1940.0         387.1       25547.0 1999-10-15 06:58:00 1999-11-12 19:01:00             28
        data              29           34.5          34.5          34.5          34.5          34.5          34.5           0.0        1000.5 1999-10-15 06:58:00 1999-11-12 06:58:00             28
        sms               94            1.0           1.0           1.0           1.0           1.0           1.0           0.0          94.0 1999-10-16 22:18:00 1999-11-13 22:31:00             28
1999-12 call              79          171.7           2.0          10.5          55.0         152.0        2120.0         324.7       13561.0 1999-11-14 17:24:00 1999-12-14 19:54:00             30
        data              30           34.5          34.5          34.5          34.5          34.5          34.5           0.0        1035.0 1999-11-13 06:58:00 1999-12-12 06:58:00             29
        sms               48            1.0           1.0           1.0           1.0           1.0           1.0           0.0          48.0 1999-11-14 17:28:00 1999-12-07 23:22:00             23
2000-01 call              88          194.0           2.0          15.5          55.5         273.5        1859.0         300.7       17070.0 1999-12-15 20:03:00 2000-01-14 20:47:00             30
        data              31           34.5          34.5          34.5          34.5          34.5          34.5           0.0        1069.5 1999-12-13 06:58:00 2000-01-12 06:58:00             30
        sms               86            1.0           1.0           1.0           1.0           1.0           1.0           0.0          86.0 1999-12-15 19:56:00 2000-01-14 23:36:00             30
2000-02 call              67          215.2           1.0          30.0          89.0         241.0        1863.0         329.7       14416.0 2000-01-15 10:36:00 2000-02-09 17:54:00             25
        data              31           34.5          34.5          34.5          34.5          34.5          34.5           0.0        1069.5 2000-01-13 06:58:00 2000-02-12 06:58:00             30
        sms               39            1.0           1.0           1.0           1.0           1.0           1.0           0.0          39.0 2000-01-15 12:23:00 2000-02-10 21:40:00             26
2000-03 call              47          462.3           2.0          33.5         107.0         320.0       10528.0        1552.2       21727.0 2000-02-12 20:15:00 2000-03-04 12:29:00             20
        data              29           34.5          34.5          34.5          34.5          34.5          34.5           0.0        1000.5 2000-02-13 06:58:00 2000-03-13 06:58:00             29
        sms               25            1.0           1.0           1.0           1.0           1.0           1.0           0.0          25.0 2000-02-19 18:46:00 2000-03-14 00:16:00             23

6.27.2. MultiIndex Creation

6.27.3. Cross Section

>>> df.xs('call', level=1)
         duration_count  duration_mean  duration_min  duration_q25  duration_q50  duration_q75  duration_max  duration_std  duration_sum      datetime_first       datetime_last  datetime_days
period
1999-11             107          238.8           1.0           5.5          48.0         328.0        1940.0         387.1       25547.0 1999-10-15 06:58:00 1999-11-12 19:01:00             28
1999-12              79          171.7           2.0          10.5          55.0         152.0        2120.0         324.7       13561.0 1999-11-14 17:24:00 1999-12-14 19:54:00             30
2000-01              88          194.0           2.0          15.5          55.5         273.5        1859.0         300.7       17070.0 1999-12-15 20:03:00 2000-01-14 20:47:00             30
2000-02              67          215.2           1.0          30.0          89.0         241.0        1863.0         329.7       14416.0 2000-01-15 10:36:00 2000-02-09 17:54:00             25
2000-03              47          462.3           2.0          33.5         107.0         320.0       10528.0        1552.2       21727.0 2000-02-12 20:15:00 2000-03-04 12:29:00             20
>>> df.xs('call', level='item')
         duration_count  duration_mean  duration_min  duration_q25  duration_q50  duration_q75  duration_max  duration_std  duration_sum      datetime_first       datetime_last  datetime_days
period
1999-11             107          238.8           1.0           5.5          48.0         328.0        1940.0         387.1       25547.0 1999-10-15 06:58:00 1999-11-12 19:01:00             28
1999-12              79          171.7           2.0          10.5          55.0         152.0        2120.0         324.7       13561.0 1999-11-14 17:24:00 1999-12-14 19:54:00             30
2000-01              88          194.0           2.0          15.5          55.5         273.5        1859.0         300.7       17070.0 1999-12-15 20:03:00 2000-01-14 20:47:00             30
2000-02              67          215.2           1.0          30.0          89.0         241.0        1863.0         329.7       14416.0 2000-01-15 10:36:00 2000-02-09 17:54:00             25
2000-03              47          462.3           2.0          33.5         107.0         320.0       10528.0        1552.2       21727.0 2000-02-12 20:15:00 2000-03-04 12:29:00             20
>>> df.xs('call', level=1).loc[:, ['duration_count', 'duration_mean']]
         duration_count  duration_mean
period
1999-11             107          238.8
1999-12              79          171.7
2000-01              88          194.0
2000-02              67          215.2
2000-03              47          462.3
>>> df.xs('call', level=1).loc[:, 'duration_count']
period
1999-11    107
1999-12     79
2000-01     88
2000-02     67
2000-03     47
Name: duration_count, dtype: int64