如何用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的行数
具体步骤拆解:
- 把每行数据转换成集合,过滤掉不在目标范围内的数字(比如你的数据里的0);
- 生成「存在性矩阵」:每行对应目标数字是否出现(1表示出现,0表示未出现);
- 通过矩阵乘法快速计算共现次数,再归一化得到概率矩阵。
第三步:完整代码实现
# 定义目标数字集合,匹配你预期结果的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
相关产品推荐
相关产品推荐

