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