能否用Pandas数据透视表生成列共现计数矩阵?
回答
最优方案:矩阵乘法(无需透视表)
这个需求本质是计算二进制特征矩阵的协现矩阵,直接用矩阵乘法是最高效的实现方式,代码简洁且性能远超嵌套循环:
# 提取特征列(排除"I"列) features = df.drop("I", axis=1) # 矩阵乘法:特征矩阵转置 × 原特征矩阵,直接得到两两列的同时为1的行数 cooccurrence = features.T.dot(features)
运行后得到的cooccurrence与目标result完全一致,数据量越大,该方法的效率优势越明显。
用透视表实现的思路(不推荐,效率偏低)
如果一定要用透视表,需要先将数据转换为长格式,再通过透视统计两两组合的次数,步骤繁琐且效率远低于矩阵乘法:
# 转换为长格式:仅保留值为1的列记录 long_df = df.melt(id_vars="I", var_name="col", value_name="val") long_df = long_df[long_df["val"] == 1].drop("val", axis=1) # 合并自身,得到每行中所有为1的列的两两组合 merged = pd.merge(long_df, long_df, on="I", suffixes=("_x", "_y")) # 透视统计组合出现的次数,填充空值为0 pivot_result = merged.pivot_table(index="col_x", columns="col_y", values="I", aggfunc="count", fill_value=0)
这种方法仅适合理解透视表的应用场景,实际生产中不建议使用。
内容的提问来源于stack exchange,提问作者mans
相关产品推荐
相关产品推荐

