我正在尝试重组表,现在将其大致设置为所需格式。
我最终得到了一个多索引表,我想将此表转换为单表并具有以下列
| | 'SourceID' | 'P1_VAL_1' | 'P2_VAL_1' | 'P3_VAL_1' | 'P4_VAL_1' | 'P1_VAL_2' | 'P2_VAL_2' | 'P3_VAL_2' | 'P4_VAL_2' |
我不知道如何合并索引级别?
例:import pandas as pd
d = {'SourceID': [1, 1, 1, 1, 2, 2, 2],
'FieldName': ["P1", "P2", "P3", "P4", "P1", "P2", "P3"],
'VAL_1': [100, 200, 300, 400 , 500, 600, 700],
'VAL_2': [1000, 2000, 3000, 4000, 5000, 6000, 7000],}
df = pd.DataFrame(data=d)
gby_temp = df.groupby(['SourceID', 'FieldName']).mean().unstack('FieldName')
L = [(a, f'{b}_{a}') for a, b in gby_temp.columns]
gby_temp.columns = pd.MultiIndex.from_tuples(L)
gby_temp = gby_temp.reset_index()
gby_temp.set_index('SourceID')
gby_temp = gby_temp.reindex(sorted(gby_temp.columns), axis=1)
display(gby_temp)
电流输出
| | ('SourceID', '') | ('VAL_1', 'P1_VAL_1') | ('VAL_1', 'P2_VAL_1') | ('VAL_1', 'P3_VAL_1') | ('VAL_1', 'P4_VAL_1') | ('VAL_2', 'P1_VAL_2') | ('VAL_2', 'P2_VAL_2') | ('VAL_2', 'P3_VAL_2') | ('VAL_2', 'P4_VAL_2') |
|---:|-------------------:|------------------------:|------------------------:|------------------------:|------------------------:|------------------------:|------------------------:|------------------------:|------------------------:|
| 0 | 1 | 100 | 200 | 300 | 400 | 1000 | 2000 | 3000 | 4000 |
| 1 | 2 | 500 | 600 | 700 | nan | 5000 | 6000 | 7000 | nan |
原始表
| | SourceID | FieldName | VAL_1 | VAL_2 |
| ---- | -------- | --------- | ----- | ----- |
| 0 | 1 | P1 | 100 | 1000 |
| 1 | 1 | P2 | 200 | 2000 |
| 2 | 1 | P3 | 300 | 3000 |
| 3 | 1 | P4 | 400 | 4000 |
| 4 | 2 | P1 | 500 | 5000 |
| 5 | 2 | P2 | 600 | 6000 |
| 6 | 2 | P3 | 700 | 7000 |
答案 0 :(得分:1)
我认为您的解决方案应该简化,因为不是必需的新MultiIndex
,而是在unstack
之后加入列名的值:
gby_temp = df.groupby(['SourceID', 'FieldName']).mean().unstack('FieldName')
gby_temp.columns = [f'{b}_{a}' for a, b in gby_temp.columns]
gby_temp = gby_temp.reset_index()
print(gby_temp)
SourceID P1_VAL_1 P2_VAL_1 P3_VAL_1 P4_VAL_1 P1_VAL_2 P2_VAL_2 \
0 1 100.0 200.0 300.0 400.0 1000.0 2000.0
1 2 500.0 600.0 700.0 NaN 5000.0 6000.0
P3_VAL_2 P4_VAL_2
0 3000.0 4000.0
1 7000.0 NaN