我具有以下格式的数据框:
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'
是否甚至可以添加这样的子级列?此时我真的对语法感到困惑。
答案 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)
我发现了如何使用stack
和unstack
来解决它:
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