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

如何用Pandas计算DataFrame中1-9整数的共现概率?

在Pandas中计算数字共现概率的实现方法

首先明确:Pandas并没有专门直接实现这个需求的内置函数,但我们可以通过组合几个基础操作来高效达成目标。先理清楚你的需求核心:针对range(1,9)(看你预期结果包含9,推测是笔误,下面代码会兼容1-9的范围)里的每个数字,计算它和其他数字在同一行出现的概率(对角线为1,即自身共现概率为1)。

第一步:还原示例DataFrame

先把你给出的原始数据转换成可操作的Pandas DataFrame:

import pandas as pd

# 你的原始每行数字序列
data = [
    [1,2,3,4],
    [2,2,3,4],
    [3,2,5,6],
    [1,2,7,8],
    [2,2,9,0],
    [3,2,2,1],
    [1,2,4,3],
    [2,2,6,5],
    [3,2,8,7],
    [1,2,0,9]
]
df = pd.DataFrame(data, columns=['a','b','c','d'])

第二步:核心实现思路

我们的目标是计算当数字x出现时,数字y同时出现的概率,公式为:
P(y|x) = 同时包含x和y的行数 / 包含x的行数

具体步骤拆解:

  1. 把每行数据转换成集合,过滤掉不在目标范围内的数字(比如你的数据里的0);
  2. 生成「存在性矩阵」:每行对应目标数字是否出现(1表示出现,0表示未出现);
  3. 通过矩阵乘法快速计算共现次数,再归一化得到概率矩阵。

第三步:完整代码实现

# 定义目标数字集合,匹配你预期结果的1-9范围
target_nums = range(1,10)

# 1. 处理每行数据:转成集合并只保留目标数字
row_sets = df.apply(lambda row: set(row) & set(target_nums), axis=1)

# 2. 构建存在性矩阵:每行每个目标数字是否存在
presence_matrix = pd.DataFrame(
    [{num: 1 if num in s else 0 for num in target_nums} for s in row_sets],
    columns=target_nums
)

# 3. 计算每个数字出现的总行数
num_counts = presence_matrix.sum(axis=0)

# 4. 计算共现次数矩阵:矩阵转置相乘,快速得到任意两数字的共现行数
cooccur_counts = presence_matrix.T @ presence_matrix

# 5. 计算共现概率:共现次数除以对应数字的出现总行数
cooccur_prob = cooccur_counts.div(num_counts, axis=0)

# 6. 把对角线设为1(自身与自身的共现概率为1)
import numpy as np
np.fill_diagonal(cooccur_prob.values, 1)

# 查看格式化后的结果
print(cooccur_prob.round(2))

代码细节说明

  • presence_matrix:这是一个0-1矩阵,每行对应原始数据的一行,每列对应一个目标数字,值为1表示该数字在该行出现;
  • cooccur_counts:利用矩阵转置相乘的特性,快速计算出任意两个数字的共现次数(比如cooccur_counts.loc[1,2]就是同时包含1和2的行数);
  • cooccur_prob:将共现次数除以对应数字的出现总行数,得到条件概率,也就是你要的共现概率;
  • 最后用np.fill_diagonal把对角线设为1,完全匹配你预期结果的格式。

灵活调整说明

如果你的共现概率定义和上述不同(比如是共现次数除以总行数,而非除以x的出现次数),只需修改第5步的除数:

# 改用总行数作为除数
cooccur_prob = cooccur_counts / len(df)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:32:07