在多级列索引的每个列上添加一个子列

时间:2019-08-07 12:49:16

标签: python pandas multi-index

我具有以下格式的数据框:

                                                                                           59e75f2b9e182f68cf25721d 59e75f2bc0bd722a5f395ee9 59e75f2c05e40310ebe1f433  ... 5c4869550bf31d2f95cedb56 5c486a8cd3036d2417fdc61c 5c486b17d5ddca8d7f67a516
                                                                                           act                      act                      act  ...                      act                      act                      act
organisation_id          group_id                 datetime                                                                                        ...                                                                           
59e7515edb84e482acce8339 59e75177575fc94638c1f8e7 2018-04-01 02:00:00                      NaN                      NaN                      NaN  ...                      NaN                      NaN                      NaN
                                                  2018-04-01 02:01:00                      NaN                      NaN                      NaN  ...                      NaN                      NaN                      NaN
                                                  2018-04-01 02:02:00                      NaN                     2.15                      NaN  ...                      NaN                      NaN                      NaN
                                                  2018-04-01 02:03:00                      NaN                      NaN                    3.689  ...                      NaN                      NaN                      NaN
                                                  2018-04-01 02:04:00                      NaN                      NaN                      NaN  ...                      NaN                      NaN                      NaN
...                                                                                        ...                      ...                      ...  ...                      ...                      ...                      ...
                         5cb590649f18c69541d34f7a 2019-04-01 01:55:00                      NaN                      NaN                      NaN  ...                      NaN                      NaN                      NaN
                                                  2019-04-01 01:56:00                      NaN                      NaN                      NaN  ...                      NaN                      NaN                      NaN
                                                  2019-04-01 01:57:00                      NaN                      NaN                      NaN  ...                      NaN                      NaN                     3.07
                                                  2019-04-01 01:58:00                      NaN                      NaN                      NaN  ...                      NaN                      NaN                      NaN
                                                  2019-04-01 01:59:00                      NaN                      NaN                      NaN  ...                     2.36                      NaN                      NaN

我有一个列希望作为子列(除act之外)分配给每个级别0列,但我受制于多级列分配语法。

我已经尝试过

frame[:, 'act_group_mean'] = group_mean

frame[slice(None), (slice(None), 'act_group_mean')] = group_mean

但都会产生以下错误

TypeError: unhashable type: 'slice'

我也尝试使用.loc

frame.loc[slice(None), (slice(None), 'act_group_mean')] = group_mean

这会导致关键错误,因为这些列尚不存在。

KeyError: 'act_group_mean'

是否甚至可以添加这样的子级列?此时我真的对语法感到困惑。

2 个答案:

答案 0 :(得分:0)

如果理解正确,并且希望在所有行(所有索引值)中添加具有恒定值的新列,则可以使用assign方法:

my_df = pd.DataFrame({'a': np.random.uniform(0, 1, 1000),
                 'g1': np.random.choice(['G1', 'G2', 'G3', 'G4'], 1000),
                 'g2': np.random.choice(['G1', 'G2', 'G3', 'G4'], 1000),
                 'g3': np.random.choice(['T1', 'T2', 'T3', 'T4', 'T5', 'T6'], 1000)})
## create multi index
multi_ind_df = my_df.pivot_table(index=['g1', 'g2'], columns='g3', values='a')
##assign new columns
multi_ind_df.assign(my_new_col=1)

g3           T1        T2        T3        T4        T5        T6  my_new_col
g1 g2                                                                        
G1 G1  0.585393  0.648677  0.375420  0.473017  0.631031  0.392953           1
   G2  0.515855  0.488248  0.466461  0.510628  0.609755  0.551266           1
   G3  0.621385  0.263794  0.568887  0.546096  0.459518  0.469962           1
   G4  0.562184  0.359343  0.526543  0.521753  0.443136  0.664481           1
G2 G1  0.642039  0.580019  0.369168  0.463687  0.694785  0.557849           1
   G2  0.456903  0.441002  0.724860  0.484172  0.588506  0.536483           1
   G3  0.453204  0.450091  0.503147  0.522465  0.511477  0.535636           1
   G4  0.543440  0.452418  0.672782  0.464103  0.501700  0.558984           1
G3 G1  0.520475  0.472433  0.555442  0.349075  0.317382  0.503188           1
   G2  0.353889  0.576193  0.556259  0.525939  0.550829  0.407469           1
   G3  0.689357  0.544241  0.577140  0.470081  0.513596  0.582277           1
   G4  0.457328  0.539601  0.390309  0.350227  0.741758  0.515508           1
G4 G1  0.547796  0.469958  0.532626  0.526231  0.407550  0.476134           1
   G2  0.425082  0.410824  0.561965  0.433013  0.423329  0.419467           1
   G3  0.588391  0.646512  0.345720  0.663540  0.627271  0.544019           1

答案 1 :(得分:0)

我发现了如何使用stackunstack来解决它:

frame.columns = [frame.columns, ['act'] * len(frame.columns)]
frame = frame.stack(level=0, dropna=False)
frame.index.rename(
    ['organisation_id', 'group_id', 'datetime', 'entity_id'], inplace=True)
frame['act_group_mean'] = float('nan')
frame = frame.unstack('entity_id').swaplevel(
    axis=1).sort_index().sort_index(axis=1)
frame.loc[(slice(None), slice(None), slice(None)),
              (slice(None), 'act_group_mean')] = group_mean

使用它可以得到以下数据框:

entity_id                                                                                  59e75f2b9e182f68cf25721d                59e75f2bc0bd722a5f395ee9                 ... 5c486a8cd3036d2417fdc61c                5c486b17d5ddca8d7f67a516               
                                                                                           act act_group_mean                      act act_group_mean  ...                      act act_group_mean                      act act_group_mean
organisation_id          group_id                 datetime                                                                                             ...                                                                                
59e7515edb84e482acce8339 59e75177575fc94638c1f8e7 2018-04-01 02:00:00                      NaN       4.905861                      NaN       4.905861  ...                      NaN       4.905861                      NaN       4.905861
                                                  2018-04-01 02:01:00                      NaN       4.905861                      NaN       4.905861  ...                      NaN       4.905861                      NaN       4.905861
                                                  2018-04-01 02:02:00                      NaN       4.905861                     2.15       4.905861  ...                      NaN       4.905861                      NaN       4.905861
                                                  2018-04-01 02:03:00                      NaN       4.905861                      NaN       4.905861  ...                      NaN       4.905861                      NaN       4.905861
                                                  2018-04-01 02:04:00                      NaN       4.905861                      NaN       4.905861  ...                      NaN       4.905861                      NaN       4.905861
...                                                                                        ...            ...                      ...            ...  ...                      ...            ...                      ...            ...
                         5cb590649f18c69541d34f7a 2019-04-01 01:55:00                      NaN       2.901522                      NaN       2.901522  ...                      NaN       2.901522                      NaN       2.901522
                                                  2019-04-01 01:56:00                      NaN       2.901522                      NaN       2.901522  ...                      NaN       2.901522                      NaN       2.901522
                                                  2019-04-01 01:57:00                      NaN       2.901522                      NaN       2.901522  ...                      NaN       2.901522                     3.07       2.901522
                                                  2019-04-01 01:58:00                      NaN       2.901522                      NaN       2.901522  ...                      NaN       2.901522                      NaN       2.901522
                                                  2019-04-01 01:59:00                      NaN       2.901522                      NaN       2.901522  ...                      NaN       2.901522                      NaN       2.901522