我的数据库里有一个很大的游戏记录数据集。
假设一个数据帧是其中的一部分,并表示单个游戏,如:

+----------+------+------+-------+----------+------------+-----+----------------+
| _id_game | age  | rank | grade |   time   |   date     | ... |   _id_player   |
+----------+------+------+-------+----------+------------+-----+----------------+
| key2589  | 14.0 |  1.0 | B     | 00:02:34 | 2015/08/02 | ... | maximi-125     |
| key2589  | 28.0 |  2.0 | A     | 00:02:50 | 2015/08/02 | ... | scooby-897     |
| key2589  | 16.0 |  3.0 | B     | 00:03:21 | 2015/08/02 | ... | zorro-003      |
| key2589  | 30.0 |  4.0 | D     | 00:03:45 | 2015/08/02 | ... | barabapapa-007 |
+----------+------+------+-------+----------+------------+-----+----------------+

上面这个数据框的每一行代表这个游戏的一个玩家。
我想让每一排游戏中所有其他玩家都呈现出一些特征(所以每个玩家都和他的竞争对手进行了比较)。
我想修改数据框如下:
+----------+------+------+-------+----------+------------+--------+--------+--------+----------+-----+----------------+
| _id_game | age  | rank | grade |   time   |    date    | p1_age | p2_age | p3_age | p1_grade | ... |   _id_player   |
+----------+------+------+-------+----------+------------+--------+--------+--------+----------+-----+----------------+
| key2589  | 14.0 |  1.0 | B     | 00:02:34 | 2015/08/02 |   28.0 |   16.0 |   30.0 | A        | ... | maximi-125     |
| key2589  | 28.0 |  2.0 | A     | 00:02:50 | 2015/08/02 |   14.0 |   16.0 |   30.0 | B        | ... | scooby-897     |
| key2589  | 16.0 |  3.0 | B     | 00:03:21 | 2015/08/02 |   14.0 |   28.0 |   30.0 | B        | ... | zorro-003      |
| key2589  | 30.0 |  4.0 | D     | 00:03:45 | 2015/08/02 |   14.0 |   28.0 |   16.0 | B        | ... | barabapapa-007 |
+----------+------+------+-------+----------+------------+--------+--------+--------+----------+-----+----------------+

如你所见,我不会复制日期或游戏。只是具体领域球员的特点是什么。
其主要思想是,考虑到一行所代表的每个个体的其他竞争对手的存在,对一个领域进行预测。
我不知道如何在一个熊猫数据帧考虑到一个df只是一个游戏。考虑到数据帧包含一堆游戏,这就更复杂了。
有人帮我吗?

最佳答案

这是一个交叉连接问题,在连接之后,我们需要筛选以排除每行的重复项,然后重新格式化输出

s=df[['_id_game','rank']].merge(df[['_id_game','age','rank','grade']],on='_id_game')#  merge here
s=s[s.rank_x!=s.rank_y]# filter the one already have
s=s.assign(key=s.groupby(['_id_game','rank_x']).cumcount()+1)# ge tthe key for pivot
s=s.set_index(['_id_game','rank_x','key'])[['age','grade']].unstack() # reformat
s.columns=s.columns.map('P{0[1]}_{0[0]}'.format)# flatten the columns
s
Out[850]:
                 P1_age  P2_age  P3_age P1_grade P2_grade P3_grade
_id_game rank_x
key2589  1.0       28.0    16.0    30.0        A        B        D
         2.0       14.0    16.0    30.0        B        B        D
         3.0       14.0    28.0    30.0        B        A        D
         4.0       14.0    28.0    16.0        B        A        B

您只需要merge返回原始数据帧检查link

10-02 22:52