如何按列名拆分hpa、upc维度,将二维DataFrame转为三维?
转换为多级索引DataFrame实现多维度筛选
第一步:还原你的原始DataFrame
先把你提供的数据用pandas构建出来(方便后续操作):
import pandas as pd import numpy as np # 构建原始数据 data = { 'hpa02upc00': [58.28, np.nan, np.nan], 'hpa01upc01': [58.23, np.nan, np.nan], 'hpa01upc00': [58.95, 58.16, np.nan], 'hpa00upc02': [58.09, np.nan, np.nan], 'hpa00upc01': [58.84, 58.06, np.nan], 'hpa00upc00': [np.nan, 58.85, 58.08] } df = pd.DataFrame(data, index=[0, -1, -2]) df.index.name = 'pwr'
第二步:拆分列名为多级索引(hpa + upc)
核心是把hpaXXupcXX格式的列名拆成hpa和upc两个层级,这样就能直接按这两个维度筛选:
# 用正则提取列名中的hpa和upc编号 df.columns = df.columns.str.extract(r'hpa(\d+)upc(\d+)', expand=True) # 给多级列设置名称,方便后续识别 df.columns.names = ['hpa', 'upc']
处理后的DataFrame结构会变成:
hpa 02 01 01 00 00 00 upc 00 01 00 02 01 00 pwr 0 58.28 58.23 58.95 58.09 58.84 NaN -1 NaN NaN 58.16 NaN 58.06 58.85 -2 NaN NaN NaN NaN NaN 58.08
第三步:按hpa/upc维度筛选数据
1. 筛选指定hpa的所有列
比如提取hpa=00的所有数据:
hpa00_data = df.xs('00', level='hpa', axis=1)
2. 筛选指定upc的所有列
比如提取upc=00的所有数据:
upc00_data = df.xs('00', level='upc', axis=1)
3. 同时筛选hpa和upc的组合
比如提取hpa=01且upc=00的列:
specific_col = df[('01', '00')]
可选:转成长表格式(更灵活的多维度筛选)
如果需要更自由的行级筛选,可以把宽表转成长表,将hpa、upc转为列:
long_df = df.stack(level=['hpa', 'upc']).reset_index(name='value')
转后的长表结构:
pwr hpa upc value 0 0 02 00 58.28 1 0 01 01 58.23 2 0 01 00 58.95 3 0 00 02 58.09 4 0 00 01 58.84 5 -1 01 00 58.16 6 -1 00 01 58.06 7 -1 00 00 58.85 8 -2 00 00 58.08
此时可以用布尔索引做复杂筛选,比如找pwr=-1且hpa=00的数据:
filtered_data = long_df[(long_df['pwr'] == -1) & (long_df['hpa'] == '00')]
内容的提问来源于stack exchange,提问作者AAmes
相关产品推荐
相关产品推荐

