Pandas:将含多标识符的DataFrame转换为规整格式
Pandas DataFrame 格式转换解决方案
问题描述
现有结构特殊的Pandas DataFrame:Site列与多组Identifier列共存,每组Identifier对应的天数列数量不固定,需将其转换为每行对应一个「Site+Identifier」组合的规整格式。
示例输入DataFrame
import pandas as pd df = pd.DataFrame({ 'Unnamed: 0': ['Site',"A", "B","C"], 'Unnamed: 1': ['Identifier 1',"Land", "Land","Land"], 'Unnamed: 2': ['Day 1',1, 2,3], 'Unnamed: 3': ['Day 2',4, 5,6], 'Unnamed: 4': ['Day 3',7, 8,9], 'Unnamed: 5': ['Day 4',10, 11,12], 'Unnamed: 6': ['Identifier 2',"Water", "Water","Water"], 'Unnamed: 7': ['Day 1',13, 14,15], 'Unnamed: 8': ['Day 2',16, 17,18], 'Unnamed: 9': ['Day 3',19, 20,21], 'Unnamed: 10': ['Day 4',22, 23,24], })
解决思路与代码
核心逻辑是拆分每组Identifier对应的列,将其与Site列合并后再拼接所有结果:
# 提取站点列数据 site_col = df.iloc[1:, 0].reset_index(drop=True) # 定位所有Identifier列的起始索引 identifier_col_indices = [i for i, val in enumerate(df.iloc[0]) if 'Identifier' in val] result_list = [] for idx in identifier_col_indices: # 获取当前Identifier的名称 identifier_name = df.iloc[0, idx] # 确定当前Identifier组的列范围(到下一个Identifier列或末尾) next_idx = identifier_col_indices[identifier_col_indices.index(idx)+1] if identifier_col_indices.index(idx) < len(identifier_col_indices)-1 else len(df.columns) # 提取当前组的所有列 group_data = df.iloc[:, idx:next_idx] # 设置表头为第一行的值 group_data.columns = group_data.iloc[0] # 移除表头行,保留数据行 group_data = group_data.iloc[1:].reset_index(drop=True) # 插入Site列到最前面 group_data.insert(0, 'Site', site_col) # 加入结果列表 result_list.append(group_data) # 拼接所有组的结果 final_df = pd.concat(result_list, ignore_index=True) # 输出目标格式 print(final_df.to_csv(sep='\t', index=False))
最终输出
Site Identifier 1 Day 1 Day 2 Day 3 Day 4 A Land 1 4 7 10 B Land 2 5 8 11 C Land 3 6 9 12 A Water 13 16 19 22 B Water 14 17 20 23 C Water 15 18 21 24
内容的提问来源于stack exchange,提问作者D P
相关产品推荐
相关产品推荐

