如何在具有层次索引的 pandas 数据框中添加和计算(基于其他列)子列?
How to add and compute (based on other columns) a sub-column in a pandas dataframe with hierarchical index?
我是 pandas 的新手,我正在努力掌握多索引数学...
假设我们有一个包含 2D 列和 2D 行的 pandas 数据框,如示例中所示,我们如何添加 "sub-column" ('ALPHA', 'gamma')
其值等于
(same d1, same d2, 'ALPHA', 'alpha') +
(same d1, d2-1, 'BETA', 'alpha')
, 即 ('A',2,'ALPHA','gamma')
是 10+2 ?
ridx = pd.MultiIndex.from_tuples([('A',1),('A',2),('A',3),('B',1),('B',2),('B',3),('C',1),('C',2),('C',3)], names=['d1', 'd2'])
cidx = pd.MultiIndex.from_tuples([('ALPHA','alpha'),('ALPHA','beta'),('BETA','alpha'),('BETA','beta')], names=['d3', 'd4'])
dfmix = pd.DataFrame([(0,1,2,3),(10,11,12,13),(20,21,22,23),
(30,31,32,33),(40,41,42,43),(50,51,52,53),
(60,61,62,63),(70,71,72,73),(80,81,82,83),
], index=ridx, columns=cidx)
dfmix
您可以通过 dfmix.columns[0..n]
访问每个唯一列
以下将有助于更好地理解它:
In [129]: dfmix.columns[0]
Out[129]: ('ALPHA', 'alpha')
In [134]: dfmix[dfmix.columns[0]][1]
Out[134]: 10
In [136]: dfmix.columns[2]
Out[136]: ('BETA', 'alpha')
In [137]: dfmix[dfmix.columns[2]][0]
Out[137]: 2
In [138]: dfmix[dfmix.columns[0]][1] + dfmix[dfmix.columns[2]][0]
Out[138]: 12
单班机:
dfmix['ALPHA','gamma'] = dfmix['ALPHA','alpha']
+ dfmix.groupby(level='d1').shift()['BETA','alpha']
pd.shift is the good tool to align rows like you want. the pd.groupby
用于在应用此操作之前对行进行分组。
为了
In [6]: dfmix.sort_index(axis=1)
Out[6]:
d3 ALPHA BETA
d4 alpha beta gamma alpha beta
d1 d2
A 1 0 1 NaN 2 3
2 10 11 12 12 13
3 20 21 32 22 23
B 1 30 31 NaN 32 33
2 40 41 72 42 43
3 50 51 92 52 53
C 1 60 61 NaN 62 63
2 70 71 132 72 73
3 80 81 152 82 83
当然,如果数学公式没有意义,你有 Nan 值。
我是 pandas 的新手,我正在努力掌握多索引数学...
假设我们有一个包含 2D 列和 2D 行的 pandas 数据框,如示例中所示,我们如何添加 "sub-column" ('ALPHA', 'gamma')
其值等于
(same d1, same d2, 'ALPHA', 'alpha') +
(same d1, d2-1, 'BETA', 'alpha')
, 即 ('A',2,'ALPHA','gamma')
是 10+2 ?
ridx = pd.MultiIndex.from_tuples([('A',1),('A',2),('A',3),('B',1),('B',2),('B',3),('C',1),('C',2),('C',3)], names=['d1', 'd2'])
cidx = pd.MultiIndex.from_tuples([('ALPHA','alpha'),('ALPHA','beta'),('BETA','alpha'),('BETA','beta')], names=['d3', 'd4'])
dfmix = pd.DataFrame([(0,1,2,3),(10,11,12,13),(20,21,22,23),
(30,31,32,33),(40,41,42,43),(50,51,52,53),
(60,61,62,63),(70,71,72,73),(80,81,82,83),
], index=ridx, columns=cidx)
dfmix
您可以通过 dfmix.columns[0..n]
以下将有助于更好地理解它:
In [129]: dfmix.columns[0]
Out[129]: ('ALPHA', 'alpha')
In [134]: dfmix[dfmix.columns[0]][1]
Out[134]: 10
In [136]: dfmix.columns[2]
Out[136]: ('BETA', 'alpha')
In [137]: dfmix[dfmix.columns[2]][0]
Out[137]: 2
In [138]: dfmix[dfmix.columns[0]][1] + dfmix[dfmix.columns[2]][0]
Out[138]: 12
单班机:
dfmix['ALPHA','gamma'] = dfmix['ALPHA','alpha']
+ dfmix.groupby(level='d1').shift()['BETA','alpha']
pd.shift is the good tool to align rows like you want. the pd.groupby 用于在应用此操作之前对行进行分组。
为了
In [6]: dfmix.sort_index(axis=1)
Out[6]:
d3 ALPHA BETA
d4 alpha beta gamma alpha beta
d1 d2
A 1 0 1 NaN 2 3
2 10 11 12 12 13
3 20 21 32 22 23
B 1 30 31 NaN 32 33
2 40 41 72 42 43
3 50 51 92 52 53
C 1 60 61 NaN 62 63
2 70 71 132 72 73
3 80 81 152 82 83
当然,如果数学公式没有意义,你有 Nan 值。