如何让Pandas DataFrame的索引与列集合统一为二者的并集?
高效扩展Pandas DataFrame的行与列(适配邻接矩阵场景)
在构建有向图邻接矩阵这类场景里,DataFrame的行索引和列往往是同一类对象(比如图的节点),我们需要把索引和列都扩展成原索引与列的并集,同时填充NaN或自定义值——不用费劲写循环遍历,用Pandas原生的reindex就能高效搞定。
具体操作步骤
1. 先凑齐所有需要保留的节点
先把原索引和列的所有元素合并成一个集合,这就是我们最终要用到的行/列集合:
import pandas as pd # 拿示例DataFrame举例 df = pd.DataFrame({'A': [1, 2], 'C': [3, 4]}, index=['B', 'C']) # 合并索引和列,得到所有节点 all_nodes = df.index.union(df.columns)
2. 一次性扩展行和列
直接用reindex同时指定目标索引和列,还能直接设置填充值:
# 填充自定义值(比如邻接矩阵常用的0) expanded_df = df.reindex(index=all_nodes, columns=all_nodes, fill_value=0) # 如果想保留NaN,去掉fill_value参数就行 # expanded_df = df.reindex(index=all_nodes, columns=all_nodes)
效果展示
原DataFrame:
A C B 1 3 C 2 4
扩展后(fill_value=0):
A B C A 0 0 0 B 1 0 3 C 2 0 4
为啥这方法比遍历强?
- Pandas的
reindex是底层优化的矢量化操作,比Python循环快N倍,数据量大的时候差距特别明显 - 代码少,逻辑清晰,改起来也方便
特殊需求处理
要是你需要给不同位置的缺失值设不同规则(比如邻接矩阵的对角线填1,代表自环),扩展完再改就行:
expanded_df = df.reindex(index=all_nodes, columns=all_nodes, fill_value=0) # 对角线位置填充1 expanded_df.values[[range(len(all_nodes))]*2] = 1
内容的提问来源于stack exchange,提问作者Mateusz
相关产品推荐
相关产品推荐

