python - 从excel读取时熊猫合并单元格问题
问题描述
所以我有一个风格怪异的 xls 文件,但我对此无能为力,所以我只需要解析它。
如您所见,我有一些合并的单元格。我想要做的是填充合并单元格的空值(“填充”),但也要保持空单元格的原样。
像这样的东西
EIM, C,NI1 Enescu_Ioan, EIM, S,NI11,Enescu_Ioan
EIM, C,NI1 Enescu_Ioan, Empty
EIM, C,NI1 Enescu_Ioan EIM, S,NI11,Enescu_Ioan
EIM, C,NI1,Enescu_Ioan Empty
我现在加载文件的方式是这样的。
xl = pd.ExcelFile("data/file.xls")
df = xl.parse(0, header=None)
我也尝试过像这样打开文件并访问合并的单元格,但我得到一个空列表。
book = xlrd.open_workbook("data/file.xls")
book.sheet_by_index(0).merged_cells # This is empty []
有什么办法可以做到这一点?谢谢!
编辑
关于这个问题可能会有一些混淆,所以我会尝试更好地解释。所附图像是较大文件的子集,其中列可能以不同的顺序出现。我想要实现的是一种区分合并单元格 NAN 值(在合并单元格中只有第一列有值,其余都是 nan)和空单元格 NAN 的方法。
解决方案
设法找到解决办法
def read_excel(path):
excel = None
if path.endswith('xlsx'):
excel = pd.ExcelFile(xlrd.open_workbook(path), engine='xlrd')
elif path.endswith('xls'):
excel = pd.ExcelFile(xlrd.open_workbook(path, formatting_info=True), engine='xlrd')
else:
raise ValueError("Could not read this type of data")
return excel
def parse_excel(excel_file):
sheet_0 = excel_file.book.sheet_by_index(0)
df = excel_file.parse(0, header=None)
return sheet_0, df
def fill_merged_na(sheet, dataframe):
for e in sheet.merged_cells:
rl, rh, cl, ch = e
base_value = sheet.cell_value(rl, cl)
dataframe.iloc[rl:rh, cl:ch] = base_value
return dataframe
一些重要的位是打开将formatting_info设置为True的excel文件,以便还读取格式,例如合并的单元格和仅填充合并的nan值但保留初始空单元格的fill_merged_na函数。
推荐阅读
- lua - 如何将我的 ESP8266 闪回,已经写入它?
- php - 所有客户都在一个数据库或单独的数据库中?
- c++ - 由于线程冲突 Qt C++,Google 语音识别不起作用
- javascript - Vuejs 搜索栏过滤器不返回结果
- php - PHP: convert date time variable into date
- c# - 使用 SSIS 中的 Selenium 执行 c# 控制台应用程序
- java - 用Jsteg方法替换DCT中的LSB后如何保存jpeg图像?
- angular - MEAN (SPA) 简单授权
- merge - combineLatest 组合或合并 Observables 的替代方法
- spring - 为 Spring Web 客户端添加异常处理程序