You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

计算DataFrame列值间汉明距离:距离矩阵全为0问题排查

解决汉明距离矩阵全为0的问题

问题原因

你的代码直接将hamming_df["protein"]整个Series传入hamming_dist函数,但这个函数是为单个字符串对设计的。当传入两个相同的Series时,pandas会逐元素执行比较(每个字符串和自身对比),自然所有结果都是0,导致矩阵全为0。

解决方案

下面提供几种可行的实现方式:

1. 双重循环构建矩阵(直观易懂)

先提取蛋白质序列列表,通过嵌套循环计算每一对的汉明距离,再转换为DataFrame:

import pandas as pd

# 提取protein列的字符串列表
proteins = hamming_df["protein"].tolist()
seq_count = len(proteins)

# 初始化空距离矩阵
dist_matrix = [[0] * seq_count for _ in range(seq_count)]

# 填充矩阵
for i in range(seq_count):
    for j in range(seq_count):
        dist_matrix[i][j] = hamming_dist(proteins[i], proteins[j])

# 转换为带索引和列名的DataFrame
hamming_distance_df = pd.DataFrame(dist_matrix, index=proteins, columns=proteins)

2. Pandas Apply 广播实现(简洁写法)

利用apply方法对每个序列,计算它与所有序列的汉明距离:

proteins = hamming_df["protein"]
hamming_distance_df = proteins.apply(lambda x: proteins.apply(lambda y: hamming_dist(x, y)))

3. Numpy 优化批量计算(适合大数据集)

修改汉明距离函数,利用numpy的向量化操作加速计算,提升大数据量下的效率:

import numpy as np
import pandas as pd

def hamming_dist_batch(str1, str2_series):
    # 将单个字符串转为numpy字符数组
    arr1 = np.array(list(str1))
    # 将Series中的所有字符串转为二维字符数组
    arr2 = np.array([list(s) for s in str2_series])
    # 逐元素比较后求和得到汉明距离
    return (arr1 != arr2).sum(axis=1)

proteins = hamming_df["protein"]
hamming_distance_df = proteins.apply(lambda x: hamming_dist_batch(x, proteins))

验证示例

假设hamming_df数据如下:

protein
0   hello
1   heLLo
2   world

运行后得到的距离矩阵应为:

hello  heLLo  world
hello       0      2      5
heLLo       2      0      5
world       5      5      0

内容的提问来源于stack exchange,提问作者abc_123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:27:12