如何基于DataFrame列条件正确向Python列表追加数据?
问题分析与解决
你的问题出在嵌套循环和错误的条件判断:
- 外层遍历
data.Result,内层又遍历整个data.UNITS列,导致每个Result被重复处理(次数等于DataFrame的行数),自然生成过多元素。 data.UNITS.any() == 'mg/kg'是检查整个UNITS列是否存在'mg/kg',不是判断当前行的单位,逻辑完全错误。
另外要注意Result列里有'ND'字符串,直接乘1000会报错,得先处理这种情况。
修改方案
方案1:用zip同步遍历每行的Result和UNITS
直接对应每行的两个字段,一次循环完成:
result_value = [] detection_limit_unit = [] # 处理单位列(原逻辑保留) for unit in data.UNITS: if unit == 'mg/kg': detection_limit_unit.append('ug/kg') else: detection_limit_unit.append(unit) # 同步遍历每行的Result和对应Unit for res, unit in zip(data.Result, data.UNITS): if unit == 'mg/kg': # 处理ND的情况,按需调整逻辑 if res == 'ND': result_value.append('ND') else: # 确保数值类型后计算 result_value.append(float(res) * 1000) else: # 非mg/kg单位直接保留原Result,或替换为RL(需提前定义RL) result_value.append(res if res != 'ND' else res)
方案2:用Pandas原生方法(更简洁高效)
避免循环,直接用列操作:
# 处理单位列 data['detection_limit_unit'] = data['UNITS'].replace('mg/kg', 'ug/kg') # 定义转换逻辑 def convert_result(row): if row['UNITS'] == 'mg/kg': if row['Result'] == 'ND': return 'ND' return float(row['Result']) * 1000 else: return row['Result'] # 生成结果列,转成列表 data['result_value'] = data.apply(convert_result, axis=1) result_value = data['result_value'].tolist() detection_limit_unit = data['detection_limit_unit'].tolist()
关键说明
- 必须逐行对应Result和UNITS的关系,不能嵌套遍历整个列。
- 一定要处理
'ND'这种非数值的情况,否则会触发类型错误。 - 如果
RL是固定值,把方案里的res替换成RL即可(需确保RL已定义且类型匹配)。
内容的提问来源于stack exchange,提问作者mountainscaler
相关产品推荐
相关产品推荐

