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

如何使用Python upsetplot统计pandas DataFrame列的公共值交集

实现方案

你需要的统计逻辑是按行匹配多列的共同非空值,无法通过直接替换pd.notna实现,需要先对原始DataFrame做预处理,再输入upsetplot生成图表,具体步骤如下:

1. 核心逻辑说明

from_indicators的indicators参数仅支持对整列做统一判断的函数,而你需要的是逐行校验多列值是否相等,属于行维度的多列组合判断,必须先对原始数据做转换,把“相同值对应的列组合”转为布尔矩阵,再传给upsetplot。

2. 完整代码示例

import pandas as pd
import upsetplot
from upsetplot import from_indicators, plot
import matplotlib.pyplot as plt

# 逐行处理函数:将每行的同值列转为布尔标记
def process_row(row):
    # 过滤当前行空值,按值分组对应的列名
    non_na_vals = row.dropna()
    val_col_groups = non_na_vals.groupby(non_na_vals).groups
    processed_rows = []
    for common_val, cols in val_col_groups.items():
        bool_row = pd.Series(False, index=row.index)
        bool_row[cols] = True
        # 存储共同值,方便后续标注
        bool_row["common_value"] = common_val
        processed_rows.append(bool_row)
    return pd.DataFrame(processed_rows)

# 预处理原始数据
# 此处data替换为你自己的原始DataFrame
processed_data = pd.concat([process_row(row) for _, row in data.iterrows()], ignore_index=True)

# 生成upset图
indicator_mat = processed_data[data.columns]
upset_input = from_indicators(indicators=indicator_mat, data=processed_data)
plot(upset_input, show_counts=True)
plt.show()

3. 效果验证

针对你提供的示例数据,预处理后生成的布尔矩阵对应的交集组合完全符合你的预期:

  • 值A、D对应column_1、column_2、column_4为True,计数为2
  • 值B对应column_1、column_3、column_4为True,计数为1
  • 值E对应column_1、column_3为True,计数为1
  • 值C对应column_3为True,计数为1
  • 值F对应column_5为True,计数为1

如果需要在图上展示对应共同值,可基于processed_data["common_value"]添加标注逻辑即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:27:02