如何扁平化数据框(熊猫)的特定列?
Posted
技术标签:
【中文标题】如何扁平化数据框(熊猫)的特定列?【英文标题】:How to flat specific columns of a Dataframe(pandas)? 【发布时间】:2019-05-29 11:15:40 【问题描述】:我的数据库中有一个非常大的游戏记录数据集。 假设一个数据框是其中的一部分,并代表一个游戏,例如:
+----------+------+------+-------+----------+------------+-----+----------------+
| _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 |
+----------+------+------+-------+----------+------------+--------+--------+--------+----------+-----+----------------+
如您所见,我不会重复字段 date 或 _id_game。只是具体的领域,什么是球员的特点。
主要思想是对一个领域进行预测,同时考虑到其他竞争者的存在情况。
考虑到一个 df 只是一个游戏,我不知道如何在 pandas 数据框中执行此操作。考虑到数据帧包含一堆游戏,这更加复杂。
有人帮我吗?
【问题讨论】:
只是一种提醒,您可以接受您的问题下的答案(答案左侧的复选标记) 【参考方案1】:这是一个交叉连接问题,在连接之后我们需要过滤每行排除重复,然后重新格式化输出
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('P0[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
【讨论】:
非常感谢。在我的特殊情况下,我做了 df.join(s, how='inner') 来获得我所期望的。我会尽快回答以完成该主题。再次感谢您。 我投了赞成票,但我想这不是我唯一要做的事情。我怎么能接受而不投票?这是另一个程序吗? 现在我知道那是一个符号,抱歉。我不知道。现在我知道了。以上是关于如何扁平化数据框(熊猫)的特定列?的主要内容,如果未能解决你的问题,请参考以下文章
如何从包含特定列中特定字符串的熊猫数据框中删除行? [复制]