首页 > 解决方案 > 如何在熊猫中将标头转换为多标头?这是一个重点问题

问题描述

名称 ABCBaseCIP00 ABCBaseCIP01 ABCBaseCIP02 ABC1CIP00 ABC1CIP01 ABC1CIP02 ABC2CIP00 ABC2CIP01 ABC2CIP02
X 1 2 3 4 5 6 7 8 9
是的 1 2 3 4 5 6 7 8 9
Z 1 2 3 4 5 6 7 8 9

我有上面的数据框,我希望按名称(ABCBase|ABC1|ABC2)和代码(CIP00|CIP01|CIP02|CIP00|CIP01|CIP02|CIP00|CIP01|CIP02))打破列标题,以获得下表作为输出。

谁能建议如何在熊猫中做到这一点?这是动态数据,所以不想硬编码任何东西。我正在尝试多索引和切片,但没有得到准确的结果。

|     |ABCBase          |ABC1             |ABC2             |
|-----|-----------------|-----------------|-----------------|
|Names|CIP00|CIP01|CIP02|CIP00|CIP01|CIP02|CIP00|CIP01|CIP02|
|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
|  X  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |
|  Y  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |
|  Z  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |

标签: pythonpython-3.xpandasdataframemulti-index

解决方案


这样的事情可能会做到:

import pandas as pd

df = pd.DataFrame({'ABCBaseCIP00': [1, 1, 1],
                   'ABCBaseCIP01': [2, 2, 2],
                   'ABCBaseCIP02': [3, 3, 3],
                   'ABC1CIP00': [4, 4, 4],
                   'ABC1CIP01': [5, 5, 5],
                   'ABC1CIP02': [6, 6, 6],
                   'ABC2CIP00': [7, 7, 7],
                   'ABC2CIP01': [8, 8, 8],
                   'ABC2CIP02': [9, 9, 9] },
                  index=['X', 'Y', 'Z'] )
lt = []
for col in df.columns:
    cut = col.find('CIP')
    lt.append((col[:cut], col[cut:]))
new_header = pd.MultiIndex.from_tuples(lt, names=('name', 'code'))
df.columns = new_header

结果print(df)

name ABCBase              ABC1              ABC2            
code   CIP00 CIP01 CIP02 CIP00 CIP01 CIP02 CIP00 CIP01 CIP02
X          1     2     3     4     5     6     7     8     9
Y          1     2     3     4     5     6     7     8     9
Z          1     2     3     4     5     6     7     8     9

推荐阅读