我在 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循环来实现这一点,但它看起来效率很低。有没有更好的方法来实现这一目标?
非常感谢任何建议!
答案 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