如何使用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
相关产品推荐
相关产品推荐

