问题描述
我正在开发一个小型代码生成应用程序,该应用程序加载到 Excel 文件中(使用 pandas ExcelFile
+ xlrd
),然后将其解析为多个 sql 的数据框 (ExcelFile.parse
) - 类似的操作。然后使用 map
和 lambda
函数将存储的数据作为列表返回给文件编写器,并在特定字段上使用一些 f 字符串格式。
我遇到的问题是并非 Excel 文件中的所有字段都可以预测填充,因此我在解析到数据帧期间使用了 fillna('')
,但是当我来到 f 字符串时,未填充的当我应用 :.0f
格式删除小数时,字段会导致错误。如果我不使用 fillna('')
函数,浮点数将正确格式化,但是我有多个 nan
条目作为字符串值,我无法弄清楚如何转换为 ''。
例如,下面将失败并显示 fillna('')
,因为源电子表格中的 NumField3 和 NumField 4 可以为空。
return list(
map(
lambda row: f"EXEC ***_****_*.****_Register_File("
f"{row['NumField1']:.0f},{row['NumField2']:.0f},"
f"'{row['TextField1']}','{row['TextField2']}',"
f"'{row['TextField3']}','{row['TextField4']}',"
f"{row['NumField3']:.0f},{row['NumField4']:.0f});\n",df.to_dict("records")))
我最初的方法是使用 .format()
和 itertuples()
,但这显然是一种效率较低的方法。我选择了转换为字典,这样我就可以在列表结构中保留字段名称,以便于支持。
我可能遗漏了一些非常简单的东西,但目前我只见树木不见森林。有什么建议吗?
解决方法
我想我已经解决了。我已经从 ExcelFile 对象到数据帧的解析中删除了 fillna('')
,这导致 NaN 值出现在未填充的字段中。当数据帧记录最终通过 map lambda 方法处理时,原始 NaN 值显示为字符串 'nan',因此我包含了一个 re.sub
来查找该值作为一个完整的单词并将其替换为所需的空字符串。
它不漂亮,但很管用。
return list(
re.sub(r'\bnan\b','',i) for i in map(
lambda row: f"EXEC ***_****_*.****_Register_File("
f"{row['NumField1']:.0f},{row['NumField2']:.0f},"
f"'{row['TextField1']}','{row['TextField2']}',"
f"'{row['TextField3']}','{row['TextField4']}',"
f"{row['NumField3']:.0f},{row['NumField4']:.0f});\n",df.to_dict("records")))