python - 通过分组创建矩阵 - 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)没有关系,我想从我的最终矩阵中忽略它。
我坚持这一点 - 任何帮助将不胜感激。
解决方案
让我们做一个self-join
并使用pd.crosstab
with 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
推荐阅读
- javascript - 用锚标记替换http链接
- node.js - 授权GAE服务器访问Cloud SQL Instance
- java - 如何通过命令提示符安装java
- rest - Restsharp 比 HTTPClient 好在哪里?
- node.js - nodejs app exited with code 0 when docker-compose up
- java - How to implement Parcelable
- c++ - Does any of current C++ compilers ever emit "rep movsb/w/d"?
- kubernetes - GKE Kubernetes 持久卷
- javascript - How I can use a WebSocket connection with Socket.io events and a Koa rest api?
- c# - 更新文档中的对象时,它会转换为字符串