如何将Excel Elements工作表数据解析为指定格式的Pandas DataFrame
解决方案
你的代码报错核心原因是:分组后得到的helper_df保留了原始数据表的全局索引,你提取到的主项行索引是全局位置,不是分组内的相对位置,导致np.split切割位置完全错误,最终子项列表长度和删除主项后的Value列长度不匹配。
以下是可直接运行的修改后代码,支持全部分类数据处理:
import pandas as pd import numpy as np # 直接读取Elements工作表数据 df = pd.read_excel('elements.xlsx', sheet_name='Elements', engine='openpyxl') categ_group = ['TRANSPORT', 'ACCOMODATION', 'DELIVERY'] all_result = [] def create_category_df(group_df): # 先重置组内索引,保证索引是分组内从0开始的相对位置 helper_df = group_df.reset_index(drop=True) # 获取主项在组内的索引位置 item_index = helper_df[helper_df["Item"].isin(categ_group)].index.to_list() # 切割Item列,拆分主项和对应子项 item_data = np.split(helper_df['Item'].to_numpy(), item_index) # 删除主项行,保留子项的Value数据 helper_df = helper_df.drop(helper_df.index[item_index]).reset_index(drop=True) elements = [] parent_items = [] for item_block in item_data: if item_block.size == 0: continue # 每个块第一个元素是主项,后面的是对应子项 parent_item = item_block[0] child_items = item_block[1:] elements.extend(child_items) parent_items.extend([parent_item]*len(child_items)) # 生成分组处理结果 group_result = pd.DataFrame({ "Element": elements, "Item": parent_items, "Category": group_df["Category"].iloc[0], "Value": helper_df["Value"].values }) return group_result # 按Category分组遍历处理所有分类 for _, group in df.groupby("Category"): all_result.append(create_category_df(group)) # 合并所有分组结果 final_df = pd.concat(all_result, ignore_index=True) print(final_df.to_string())
关键修改说明
- 调整数据读取逻辑,直接获取工作表的原始DataFrame,避免操作复杂的嵌套groupby对象
- 分组处理第一步先重置组内索引,确保主项定位、数组切割逻辑完全基于组内相对位置,不会出现跨分组的索引错位
- 统一遍历所有Category分组,最后合并结果,无需单独调用指定分类的处理函数
- 替换已废弃的
DataFrame.append方法为pd.concat,兼容pandas 2.0+版本
运行代码后你将得到包含A、B、C三个分类所有子项的完整结果,输出格式和你要求的示例完全一致。
内容的提问来源于stack exchange,提问作者Ian Kurtis
相关产品推荐
相关产品推荐

