从Pandas DataFrame创建结果网格

时间:2018-02-21 10:15:49

标签: python-3.x pandas numpy

我在 Pandas DataFrame 中有以下结果表。每个玩家都被分配了一个ID号:

+----------------+----------------+-------------+-------------+
| Home Player ID | Away Player ID | Home Points | Away Points |
+----------------+----------------+-------------+-------------+
|              1 |              2 |           3 |           0 |
|              3 |              4 |           1 |           1 |
|              2 |              3 |           3 |           0 |
|              4 |              1 |           3 |           0 |
|              2 |              4 |           1 |           1 |
|              3 |              1 |           1 |           1 |
|              2 |              1 |           0 |           3 |
|              4 |              3 |           1 |           1 |
|              3 |              2 |           0 |           3 |
|              1 |              4 |           0 |           3 |
|              4 |              2 |           1 |           1 |
|              1 |              3 |           1 |           1 |
+----------------+----------------+-------------+-------------+

目的是创建一个4x4 numpy 矩阵(维度等于玩家数量),并在矩阵中填入他们从各个玩家之间的游戏中获得的积分。

矩阵应该像这样结束:

+--------+---+---+---+---+
| Matrix | 1 | 2 | 3 | 4 |
+--------+---+---+---+---+
|      1 | 0 | 3 | 1 | 0 |
|      2 | 0 | 0 | 3 | 1 |
|      3 | 1 | 0 | 0 | 1 |
|      4 | 3 | 1 | 1 | 0 |
+--------+---+---+---+---+

左手栏是主场球员的身份证号码,列标题是客场球员的身份证。

例如,当Home Player ID = 1且Away Player ID = 2时,玩家1获得3分,因此矩阵(1,2)的条目(或0,1因为零索引)等于3。

我可以通过两个for循环来实现这一点,但它看起来效率很低。有没有更好的方法来实现这一目标?

非常感谢任何建议!

1 个答案:

答案 0 :(得分:0)

使用

In [217]: df.pivot_table(columns='Home Player ID', index='Away Player ID', 
                         values='Away Points', fill_value=0)
Out[217]:
Home Player ID  1  2  3  4
Away Player ID
1               0  3  1  0
2               0  0  3  1
3               1  0  0  1
4               3  1  1  0

或使用

In [221]: df.set_index(['Away Player ID', 'Home Player ID'])['Away Points'].unstack(fill_value=0)
Out[221]:
Home Player ID  1  2  3  4
Away Player ID
1               0  3  1  0
2               0  0  3  1
3               1  0  0  1
4               3  1  1  0