首页 > 解决方案 > 通过分组创建矩阵 - Python

问题描述

我正在处理一个非常大的数据集并尝试开发一个用于可视化的矩阵,但遇到了计数关系的问题。我的数据结构如下:

| Project       | University |
|---------------|------------|
| Project One   | UniA       |
| Project One   | UniB       |
| Project One   | UniC       |
| Project Two   | UniC       |
| Project Two   | UniA       |
| Project Two   | UniB       |
| Project Two   | UniD       |
| Project Three | UniE       |
| Project Four  | UniA       |
| Project Four  | UniD       |

我正在尝试创建一个这样的矩阵:

|      | UniA | UniB | UniC | UniD | UniE |
|------|------|------|------|------|------|
| UniA | 0    | 2    | 1    | 2    | 0    |
| UniB | 2    | 0    | 2    | 1    | 0    |
| UniC | 1    | 2    | 0    | 1    | 0    |
| UniD | 2    | 1    | 1    | 0    | 0    |
| UniE | 0    | 0    | 0    | 0    | 0    |

如果 Uni 与任何其他 Uni(例如 UniE)没有关系,我想从我的最终矩阵中忽略它。

我坚持这一点 - 任何帮助将不胜感激。

标签: pythonpandas

解决方案


让我们做一个self-join并使用pd.crosstabwith reindex

#do a self-join and eliminate same row matches
dfm = df.merge(df, on='Project').query('University_x != University_y')

#get unique universities
lu = df['University'].unique()

#create a crosstab report and reindex to fill zeroes
pd.crosstab(dfm['University_x'], dfm['University_y'])\
  .reindex(index=lu, columns=lu, fill_value=0)

输出:

University_y  UniA  UniB  UniC  UniD  UniE
University_x                              
UniA             0     2     2     2     0
UniB             2     0     2     1     0
UniC             2     2     0     1     0
UniD             2     1     1     0     0
UniE             0     0     0     0     0

不想看到所有零行/列删除reindex

pd.crosstab(dfm['University_x'], dfm['University_y'])

输出:

University_y  UniA  UniB  UniC  UniD
University_x                        
UniA             0     2     2     2
UniB             2     0     2     1
UniC             2     2     0     1
UniD             2     1     1     0

推荐阅读