DataFrame列表中双唯一值列的二进制转换函数问题:NaN转0、字符串转1失效排查
问题分析与修复方案
我来帮你拆解下代码里的问题,以及给出对应的修复方案~
原代码的核心问题
- 临时变量修改无效:你遍历
qarray元素时修改i=1,只是改变了临时变量i的值,完全没影响到DataFrame列里的实际数据——相当于在草稿纸上改数字,原表格根本不会变。 - 逻辑顺序错误:判断列是否只有2个唯一值的
if len(qarray) == 2被放在了遍历唯一值元素的循环里,这会导致同一个列被重复判断多次,既低效又容易出问题。
修复后的函数代码
def binary(x): '''Convert columns with exactly 2 unique values: NaNs to 0, string values to 1''' for df in x: # 先筛选出所有只有2个唯一值的列 target_columns = [col for col in df if len(df[col].unique()) == 2] for col in target_columns: # 第一步:把NaN填充为0 df[col] = df[col].fillna(0) # 第二步:把所有字符串类型的值替换成1 df[col] = df[col].apply(lambda val: 1 if isinstance(val, str) else val) return x # 调用函数处理你的DataFrame列表 qlst = binary(qlst)
修复后的效果
针对你给出的示例列Q42AvaliouMarca03,处理后会变成:
Q42AvaliouMarca03 0 0 1 1 2 0 3 1 4 0
额外说明
- 用列表推导式
target_columns先筛选目标列,比嵌套循环更清晰高效; - 使用
isinstance(val, str)判断类型比type(i) == str更稳妥,它能兼容字符串子类的情况; - 因为你只筛选“仅包含2个唯一值”的列,所以处理时无需担心除NaN和字符串外的其他数值类型干扰。
内容的提问来源于stack exchange,提问作者Carol Vieira
相关产品推荐
相关产品推荐

