我有一个非常大的数据表,其中包含 play_id
、position
和 frame
列。
play_id
- 指特定的游戏
position
- A 或 B(每个给定的游戏总共有 3 个玩家(行) - A 和 B 的任意组合)
frame
- 时间范围(例如想象每 1 秒冻结一次)
以下显示了示例数据(为清晰起见进行了简化):
play_id | 位置 | 帧 |
---|---|---|
1 | A | 1 |
1 | A | 1 |
1 | B | 1 |
1 | A | 2 |
1 | A | 2 |
1 | B | 2 |
2 | A | 1 |
2 | B | 1 |
2 | B | 1 |
2 | A | 2 |
2 | B | 2 |
2 | B | 2 |
我想为每个 play_id 计算每个位置的玩家数量(对于给定的 play_id,它们在各帧中是一致的),并为每个角色附加一个数字以使其唯一。
这将导致以下结果:
play_id | 位置 | 帧 |
---|---|---|
1 | A_1 | 1 |
1 | A_2 | 1 |
1 | B_1 | 1 |
1 | A_1 | 2 |
1 | A_2 | 2 |
1 | B_1 | 2 |
2 | A_1 | 1 |
2 | B_1 | 1 |
2 | B_2 | 1 |
2 | A_1 | 2 |
2 | B_1 | 2 |
2 | B_2 | 2 |
实际上,我有 7 个不同的位置、25 帧和大约 500,000 个 play_id(以及更多列)。
我怎样才能以有效的方式实现这一目标?我认为应该使用 groupby
,但我不知道如何使用。
答案 0 :(得分:1)
您可以groupby.cumcount
,按所有列分组并添加位置计数:
df['position'] = df.position.str.cat(df.groupby(['play_id','frame','position']).position
.cumcount().add(1).astype(str),
sep='_')
print(df)
play_id position frame
0 1 A_1 1
1 1 A_2 1
2 1 B_1 1
3 1 A_1 2
4 1 A_2 2
5 1 B_1 2
6 2 A_1 1
7 2 B_1 1
8 2 B_2 1
9 2 A_1 2
10 2 B_1 2
11 2 B_2 2