Excel数据处理:跳过空行并修复列长度不匹配问题
处理Excel多行拆分:空值与列长度不匹配解决方案
原始数据集
| Col 1 | Col 2 | Col 3 | Col 4 | Col 5 | Col 6 | Col 7 | Col 8 |
|---|---|---|---|---|---|---|---|
| 1 | 2 | A\n \nB | C\n \nD | E\n \nF | G\n \nH | I\n \nJ | K\n \nL |
| 3 | 4 | ||||||
| 5 | 6 | a\n \nb | c | e\n \nf | g\n \nh | i\n \nj | k\n \nl |
需求说明
- 以Col3按
\n \n拆分后的结果数量,确定每行需要生成的新行数量 - Col1、Col2在所有新行中重复原行值
- 直接删除Col3为空的行
- 若Col3-Col8中某列拆分后的长度与Col3不一致,该列在所有新行中重复对应值(如示例中Col4的
c会在两行都显示)
目标数据集
| Col 1 | Col 2 | Col 3 | Col 4 | Col 5 | Col 6 | Col 7 | Col 8 |
|---|---|---|---|---|---|---|---|
| 1 | 2 | A | C | E | G | I | K |
| 1 | 2 | B | D | F | H | J | L |
| 5 | 6 | a | c | e | g | i | k |
| 5 | 6 | b | c | f | h | j | l |
现有代码问题
原代码仅能处理Col3有值且所有列拆分后长度一致的情况,无法正确处理Col3空值行,也不能解决列拆分长度不匹配的填充问题。
修改后的完整代码
import pandas as pd def PrintConsole(content): print(content) print("-"*50) def ExitCode(): pass def splitappendix(moduleName): tableHeaders = ["A", "B", "C", "D", "E", "F", "G", "H"] splitfunctionHeaders = ["Col 1", "Col 2", "Col 3", "Col 4", "Col 5", "Col 6", "Col 7", "Col 8"] df = pd.read_excel(f'Output\\{moduleName}') df.columns = splitfunctionHeaders PrintConsole("原始数据:") PrintConsole(df) # 一次性删除Col3为空的行并重置索引 df = df.dropna(axis=0, subset=['Col 3']).reset_index(drop=True) PrintConsole("删除Col3空值后的数据:") PrintConsole(df) df_rep = pd.DataFrame(columns=splitfunctionHeaders) for idx, row in df.iterrows(): # 按Col3拆分结果确定新行数量 col3_split = row['Col 3'].split('\n \n') row_count = len(col3_split) # 生成重复的Col1、Col2值 single_rep = pd.DataFrame({ 'Col 1': [row['Col 1']] * row_count, 'Col 2': [row['Col 2']] * row_count }) # 逐个处理Col3至Col8的拆分与填充 for col in splitfunctionHeaders[2:]: col_value = row[col] if pd.isna(col_value): # 空值列填充空字符串 single_rep[col] = [''] * row_count else: col_split = col_value.split('\n \n') # 若拆分后长度不足,重复最后一个值补足 if len(col_split) < row_count: col_split += [col_split[-1]] * (row_count - len(col_split)) # 取前row_count个值,避免拆分过长的情况 single_rep[col] = col_split[:row_count] df_rep = pd.concat([df_rep, single_rep], ignore_index=True) PrintConsole("最终处理结果:") PrintConsole(df_rep) # 重命名列并保存到Excel df_rep.columns = tableHeaders df_rep.to_excel(f'Output\\{moduleName}', index=False) if __name__ == "__main__": moduleName = 'Appendix.xlsx' splitappendix(moduleName) PrintConsole("Split Complete") ExitCode()
关键优化点
- 高效删除空值行:直接使用
df.dropna批量删除Col3为空的行,避免循环中修改DataFrame导致的索引混乱 - 统一列处理逻辑:对Col3-Col8每一列单独拆分,自动判断长度是否匹配,不足时用最后一个值填充,空值则填充空字符串
- 简化重复值生成:用列表乘法快速生成Col1、Col2的重复值,比循环赋值更高效
- 避免索引错误:删除空值后重置索引,确保循环遍历的索引连续无断层
内容的提问来源于stack exchange,提问作者Colton needs help
相关产品推荐
相关产品推荐

