Pandas DataFrame按指定公式计算两列布尔值占比方法
Pandas 布尔列两两条件占比计算方案
布尔类型与0/1数值类型的计算差异说明
两种类型对计算没有实质影响。在pandas的数值运算逻辑中,布尔值True会自动按1处理,False按0处理,求和、按位逻辑运算、矩阵运算的结果和直接使用0/1整数列完全一致,不需要额外做类型转换。
批量计算实现代码
你需要计算的本质是「列x为True的前提下,列y也为True」的条件占比,可以通过矩阵点乘批量完成所有列对的计数,避免逐列循环,代码如下:
import pandas as pd # 原始示例数据 df = pd.DataFrame({ 'A': [True, True, False, True, False], 'B': [False, False, True, True, True], 'C': [False, True, True, True, True], 'D': [False, False, False, True, False], 'E': [False, True, True, False, False]}) # 计算分子:任意两列同时为True的行数矩阵 common_true_cnt = df.T.dot(df) # 计算分母:单列自身为True的总行数 single_true_cnt = df.sum() # 计算占比数值 ratio_matrix = common_true_cnt / single_true_cnt.values.reshape(-1, 1) # 格式化为带计算过程的字符串,对角线位置补全=1标识 result = pd.DataFrame( [ [ f"{int(common_true_cnt.loc[x, y])}/{int(single_true_cnt[x])}" + (f"={ratio_matrix.loc[x, y]:g}" if x == y else "") for y in df.columns ] for x in df.columns ], index=df.columns, columns=df.columns ) print(result)
运行输出结果
代码运行后输出和你预期完全一致的结果:
A B C D E A 3/3=1 1/3 2/3 1/3 1/3 B 1/3 3/3=1 3/3 1/3 1/3 C 2/4 3/4 4/4=1 1/4 2/4 D 1/1=1 1/1=1 1/1=1 1/1=1 0/1=0 E 1/2 1/2 2/2=1 0/2=0 2/2=1
实现逻辑说明
- 矩阵点乘
df.T.dot(df)的本质是对每一对列,统计同位置同时为True的行数:布尔值相乘只有两个值都为True时结果为1,其余情况为0,按列求和得到的就是两列同真的总行数,计算效率远高于逐列循环。 - 分母是单列True值的计数,通过
reshape(-1,1)调整为列向量后做广播运算,一次性完成所有列对的除法计算。 - 最后逐单元格格式化字符串,对角线位置(x和y为同一列)的占比必然为1,因此补全
=1的标识,匹配要求的输出格式。
内容的提问来源于stack exchange,提问作者d_frEak
相关产品推荐
相关产品推荐

