Pandas含NaN列自动转浮点数,SDTM字符列LBORRES如何保留整数无小数
问题解答
这个需求完全可以实现。你遇到的整数自动转带.0后缀的浮点数格式问题,根源是Pandas读取含缺失值的数值列时,会默认将列类型转换为float64,直接对该类型的整数值做字符串转换时就会出现格式异常,按以下方法调整即可解决:
核心修改方案
方案1:调整LBORRES字段的转换逻辑(改动最小,无需修改上游读入逻辑)
把你原来给LBORRES赋值的代码替换为带类型判断的逻辑,示例如下:
for index, row in df.iterrows(): for k,v in labos.iterrows(): if row['ID'] != 'NULL' and f"{v['CATEGORY']}" == 'NFS': val = row[f"{v['VAR']}"] # 处理LBORRES的格式 if val == 'NULL': lbor_val = '' else: # 数值类型做特殊处理 if isinstance(val, (int, float)): # 浮点数但为整数值的情况,去掉小数位 if isinstance(val, float) and val.is_integer(): lbor_val = str(int(val)) else: lbor_val = str(val) else: # 字符串类结果(positive/negative等)直接保留 lbor_val = str(val) # 写入新行 tmp_df_laboratory = tmp_df_laboratory.append({ ... 'LBORRES' : lbor_val, 'LBSTRESN' : val if val != 'NULL' else np.nan, },ignore_index=True)
方案2:从数据读入环节避免自动类型转换(更彻底,推荐)
读取实验室数据csv时,指定所有结果列的类型为object,避免Pandas自动将含缺失值的整数列转成float:
# 读取时指定dtype,不确定结果列名的话可以直接全表按object读入 df_laboratory = pd.read_csv('./csv/source/biologie_labo.csv', delimiter=",", dtype=object).fillna('NULL')
这样读入的数值都会保留原始的字符串格式,直接赋值给LBORRES即可,不需要额外做类型判断。
注意事项
- 若你的数据量较大,建议避免使用
iterrows遍历,可以改用apply或者矢量化操作提升效率,上述格式转换逻辑可以直接复用。 - 生成xpt文件前可以额外校验
LBORRES列的格式,确认整数无.0后缀、文本结果正常、空值符合SDTM规范要求。
内容的提问来源于stack exchange,提问作者Mereva
相关产品推荐
相关产品推荐

