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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:45:33