熊猫表-将多索引转换为单索引

时间:2020-04-09 07:19:37

标签: python pandas

我正在尝试重组表,现在将其大致设置为所需格式。

我最终得到了一个多索引表,我想将此表转换为单表并具有以下列

|    |   '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  |

1 个答案:

答案 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