DataFrame列众数生成共识序列时的NaN问题排查与解决
DataFrame列众数的NaN来源与处理方法
NaN的来源
df.mode(axis=0)返回结果里的NaN,核心原因是部分列存在多个频次相同的众数:
- 如果某一列只有一个最高频字符(唯一众数),
mode()仅在第一行输出这个字符,后续行的对应位置就用NaN填充——因为没有其他众数可输出。 - 如果某一列有多个字符出现次数相同且均为最高频(多众数),
mode()会把这些众数依次放在不同行中,没有对应众数的位置同样用NaN填充。
你的947列里既有单众数列,也有多众数列,所以最终返回了3行结果,除第一行外,其余行都是NaN和少量多众数字符。
去除NaN并生成正确共识序列的方法
你只需要保留mode()结果的第一行(每个列的首个众数),跳过后面含NaN的行即可,无需把所有行都转成字符串。修改后的代码如下:
# 提取每个列的第一个众数组成的行 consensus = df.mode(axis=0).iloc[0] # 拼接成共识序列 seq = ''.join(consensus.values.astype(str))
这样处理后,只会得到各列最高频字符组成的序列,不会混入NaN相关内容。
原代码用to_string()会把所有行(包括含NaN的行)转换成文本,NaN字符串会被保留下来,这就是你看到多余内容的原因。直接取第一行再拼接,能彻底规避这个问题。
内容的提问来源于stack exchange,提问作者cookiemonster
相关产品推荐
相关产品推荐

