使用Pandas处理不规则结构Excel文件的数据规整问题
不规则Excel数据规整:搞定House字段处理
问题背景
原始Excel只有First、Last、Unnamed三列,数据混着人员信息、房屋属性(House/Time/Zip)和数值,而且这种乱结构还重复出现。目标是整理成包含First、Last、House、Time、Zip的规范表格。你已经用循环处理了Time字段,现在卡在House字段上,提前建好了Time和Zip列,现有代码如下:
for index, row in df.iterrows(): if row['Last'] == 'Time': currentZip = df.loc[index, 'Unnamed'] df.loc[index, 'Unnamed'] = '' df.loc[index-2, 'Time'] = currentZip
解决方案
从你处理Time的逻辑能看出规律:把Last='Time'行的Unnamed值,填充到它往上数第2行的Time列里。House字段可以照搬这个逻辑——当Last='House'时,Unnamed里的房屋信息对应填充到它上数第2行的House列。
方法1:直接扩展现有循环(小数据集适用)
如果数据量不大,直接在现有循环里加House的处理逻辑就行,改动很小:
for index, row in df.iterrows(): # 原有的Time处理逻辑 if row['Last'] == 'Time': currentZip = df.loc[index, 'Unnamed'] df.loc[index, 'Unnamed'] = '' df.loc[index-2, 'Time'] = currentZip # 新增House处理逻辑 if row['Last'] == 'House': currentHouse = df.loc[index, 'Unnamed'] df.loc[index, 'Unnamed'] = '' df.loc[index-2, 'House'] = currentHouse
方法2:用Pandas向量化操作(大数据集效率更高)
iterrows效率极低,数据量大时会拖慢速度,换成Pandas的布尔索引和移位操作更高效:
# 处理Time字段 time_rows = df['Last'] == 'Time' # 把Time行的Unnamed值,填充到它前两行的Time列 df.loc[time_rows.shift(-2).fillna(False), 'Time'] = df.loc[time_rows, 'Unnamed'].values # 清空Time行的Unnamed内容 df.loc[time_rows, 'Unnamed'] = '' # 处理House字段,逻辑和Time完全一致 house_rows = df['Last'] == 'House' df.loc[house_rows.shift(-2).fillna(False), 'House'] = df.loc[house_rows, 'Unnamed'].values df.loc[house_rows, 'Unnamed'] = ''
最后一步:清理无效行
处理完所有属性后,把那些用来标识属性的行(Last是House/Time/Zip的行)删掉,只保留人员信息行:
# 过滤掉属性标识行,重置索引 clean_df = df[~df['Last'].isin(['House', 'Time', 'Zip'])].reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Willy
相关产品推荐
相关产品推荐

