Pandas:如何在 MultiIndex 列中移动值

德维亚泰基纳

我有数据框

id    week    score                       target
              median   mean   min   max   count
11     1       0.05    0.06   0.01  0.35   12
11     2       0.07    0.09   0.03  0.49   20
11     3       0.15    0.20   0.11  0.70   10
12     2       0.10    0.15   0.02  0.19   19
12     3       0.50    0.59   0.10  0.90   30

我尝试转变值scoretarget

data['score_upd'] = data.groupby('id')['score'].shift()
data['target_upd'] = data.groupby('id')['target'].shift()

得到这个结果

id    week    score                       target
              median   mean   min   max   count
11     1       Nan     Nan    Nan   Nan    Nan
11     2       0.05    0.06   0.01  0.35   12
11     3       0.07    0.09   0.03  0.49   20
12     2       Nan     Nan    Nan   Nan    Nan
12     3       0.10    0.15   0.02  0.19   19

但我有一个错误

KeyError: 'score'

我想主要问题data.columnsMultiIndex我试图改变它,但什么也没发生。我怎样才能根据目前的情况改变它?

亨利·埃克

一种选择是使用get_loc来选择特定的列:

score_cols = data.columns[data.columns.get_loc('score')]
data[score_cols] = (
    data.groupby('id')[score_cols].shift()
)
target_cols = data.columns[data.columns.get_loc('target')]
data[target_cols] = (
    data.groupby('id')[target_cols].shift()
)
   id week  score                   target
           median  mean   min   max  count
0  11    1    NaN   NaN   NaN   NaN    NaN
1  11    2   0.05  0.06  0.01  0.35   12.0
2  11    3   0.07  0.09  0.03  0.49   20.0
3  12    2    NaN   NaN   NaN   NaN    NaN
4  12    3   0.10  0.15  0.02  0.19   19.0

|一起迈出一步:

cols = data.columns[data.columns.get_loc('score') |
                    data.columns.get_loc('target')]
data[cols] = (
    data.groupby('id')[cols].shift()
)
   id week  score                   target
           median  mean   min   max  count
0  11    1    NaN   NaN   NaN   NaN    NaN
1  11    2   0.05  0.06  0.01  0.35   12.0
2  11    3   0.07  0.09  0.03  0.49   20.0
3  12    2    NaN   NaN   NaN   NaN    NaN
4  12    3   0.10  0.15  0.02  0.19   19.0

*值得注意的是,columns如果将它们全部组合在一起,简单地切片也可以工作:

cols = data.columns[2:]
data[cols] = (
    data.groupby('id')[cols].shift()
)
   id week  score                   target
           median  mean   min   max  count
0  11    1    NaN   NaN   NaN   NaN    NaN
1  11    2   0.05  0.06  0.01  0.35   12.0
2  11    3   0.07  0.09  0.03  0.49   20.0
3  12    2    NaN   NaN   NaN   NaN    NaN
4  12    3   0.10  0.15  0.02  0.19   19.0

添加一个Index.map以向级别添加前缀:

cols = data.columns[data.columns.get_loc('score') |
                    data.columns.get_loc('target')]
data[cols.map(lambda c: (f'{c[0]}_upd', c[1]))] = (
    data.groupby('id')[cols].shift()
)
   id week  score              ... score_upd                   target_upd
           median  mean   min  ...    median  mean   min   max      count
0  11    1   0.05  0.06  0.01  ...       NaN   NaN   NaN   NaN        NaN
1  11    2   0.07  0.09  0.03  ...      0.05  0.06  0.01  0.35       12.0
2  11    3   0.15  0.20  0.11  ...      0.07  0.09  0.03  0.49       20.0
3  12    2   0.10  0.15  0.02  ...       NaN   NaN   NaN   NaN        NaN
4  12    3   0.50  0.59  0.10  ...      0.10  0.15  0.02  0.19       19.0

数据框和导入:

import pandas as pd

data = pd.DataFrame({
    ('id', ''): {0: 11, 1: 11, 2: 11, 3: 12, 4: 12},
    ('week', ''): {0: 1, 1: 2, 2: 3, 3: 2, 4: 3},
    ('score', 'median'): {0: 0.05, 1: 0.07, 2: 0.15, 3: 0.1, 4: 0.5},
    ('score', 'mean'): {0: 0.06, 1: 0.09, 2: 0.2, 3: 0.15, 4: 0.59},
    ('score', 'min'): {0: 0.01, 1: 0.03, 2: 0.11, 3: 0.02, 4: 0.1},
    ('score', 'max'): {0: 0.35, 1: 0.49, 2: 0.7, 3: 0.19, 4: 0.9},
    ('target', 'count'): {0: 12, 1: 20, 2: 10, 3: 19, 4: 30}
})

列选择如何与get_loc

# data.columns

MultiIndex([(    'id',       ''),
            (  'week',       ''),
            ( 'score', 'median'),
            ( 'score',   'mean'),
            ( 'score',    'min'),
            ( 'score',    'max'),
            ('target',  'count')],
           )

# data.columns.get_loc('score')

array([False, False,  True,  True,  True,  True, False])

# data.columns[data.columns.get_loc('score')]
 
MultiIndex([('score', 'median'),
            ('score',   'mean'),
            ('score',    'min'),
            ('score',    'max')],
           )

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章