如何用Python按特定规则转换表格结构?
Python实现表格结构转换方案
问题描述
原始表格:
Groups SP1 SP2 SP3 SP4_1 SP4_2 SP5_1 SP5_2 G1 3 4 NA 2 4 2 1 G2 NA 1 NA 3 NA NA NA G3 1 2 NA NA NA 8 NA G4 4 6 NA NA NA NA NA G5 8 9 NA NA NA NA 2
需要转换为目标表格:
G1 G2 G3 G4 G5 SP1 SP1-3 NA SP1-1 SP1-4 SP1-8 SP2 SP2-4 SP2-1 SP2-2 SP2-6 SP2-9 SP3 NA NA NA NA NA SP4 SP4_1-2;SP4_2-4 SP4_1-3 NA NA NA SP5 SP5_1-2;SP5_2-1 NA SP5_1-8 NA SP5_2-2
转换规则:
- 以原始表格的
Groups值(G1~G5)作为新表格的列 - 以SP前缀的分组(SP1~SP5)作为新表格的行
- 单个SP列(如SP1):若值非NA则格式化为
列名-值,否则填NA - 多后缀SP列(如SP4_1、SP4_2):将所有非NA的项格式化为
列名-值,用分号;连接;若全为NA则填NA
实现方案
使用pandas库处理,步骤清晰直接:
- 加载原始数据并设置
Groups列为索引 - 转置数据,让原始的分组列变为新表格的列,SP相关列变为行
- 对SP行索引按前缀分组(提取
_前的部分作为分组标识) - 对每个分组内的非NA值生成格式化字符串,合并后填充结果
- 调整最终输出的格式对齐
代码实现
import pandas as pd # 1. 读取原始数据 raw_data = """Groups SP1 SP2 SP3 SP4_1 SP4_2 SP5_1 SP5_2 G1 3 4 NA 2 4 2 1 G2 NA 1 NA 3 NA NA NA G3 1 2 NA NA NA 8 NA G4 4 6 NA NA NA NA NA G5 8 9 NA NA NA NA 2 """ df = pd.read_csv(pd.io.common.StringIO(raw_data), sep=r'\s+', na_values='NA') # 2. 设置索引并转置数据 df = df.set_index('Groups').T # 3. 生成SP分组标识(比如SP4_1转为SP4) df['sp_group'] = df.index.str.split('_').str[0] # 4. 定义格式化函数,处理每个分组的内容 def format_row_items(x): non_empty = x.dropna() if non_empty.empty: return 'NA' return ';'.join([f"{idx}-{val}" for idx, val in non_empty.items()]) # 按SP分组聚合,生成结果 result = df.groupby('sp_group').agg(format_row_items).T # 5. 清理索引和列名,对齐目标格式 result.columns.name = None result.index.name = None # 打印最终结果 print(result.to_string())
输出说明
运行代码后会输出与目标表格完全匹配的内容,终端环境下的列对齐可能略有差异,但核心格式和内容完全符合要求。
内容的提问来源于stack exchange,提问作者chippycentra
相关产品推荐
相关产品推荐

