python - 如何在熊猫中将标头转换为多标头?这是一个重点问题
问题描述
名称 | 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 |
解决方案
这样的事情可能会做到:
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