我有一个数据框
game_id move_number move colour avg_centi phase
0 03gDhPWr 1 e4 white NaN opening
1 03gDhPWr 2 d5 black 37.0 opening
2 03gDhPWr 3 e5 white 61.0 opening
3 03gDhPWr 4 c5 black -5.0 opening
4 03gDhPWr 5 Nf3 white 26.0 opening
... ... ... ... ... ... ...
110093 zzaiRa7s 36 a5+ black NaN endgame
110094 zzaiRa7s 37 Kxb5 white NaN endgame
110095 zzaiRa7s 38 c6+ black NaN endgame
110096 zzaiRa7s 39 Ka4 white NaN endgame
110097 zzaiRa7s 40 Q@b4# black NaN endgame
我想映射 colour 列,以便当颜色为 black 时 colour 列的值被替换为中的值phase 列。我想使用 pandas map 或 apply 函数来理想地执行此操作。不是 replace 太慢了。
生成的数据框应如下所示:
game_id move_number move colour avg_centi phase
0 03gDhPWr 1 e4 white NaN opening
1 03gDhPWr 2 d5 opening 37.0 opening
2 03gDhPWr 3 e5 white 61.0 opening
3 03gDhPWr 4 c5 opening -5.0 opening
4 03gDhPWr 5 Nf3 white 26.0 opening
... ... ... ... ... ... ...
110093 zzaiRa7s 36 a5+ endgame NaN endgame
110094 zzaiRa7s 37 Kxb5 white NaN endgame
110095 zzaiRa7s 38 c6+ engame NaN endgame
110096 zzaiRa7s 39 Ka4 white NaN endgame
110097 zzaiRa7s 40 Q@b4# endgame NaN endgame
我试过下面的代码,但似乎不太有效:
def wrangle_game_phase(x):
if x == 'black':
return phase
else:
return x
df['game_type'] = df['colour'].apply(wrangle_game_phase)
请您参考如下方法:
通过 pd.DataFrame.loc 使用 bool 索引:
m = df['colour'] == 'black'
df.loc[m, 'colour'] = df.loc[m, 'phase']
game_id move_number move colour avg_centi phase
0 03gDhPWr 1 e4 white NaN opening
1 03gDhPWr 2 d5 opening 37.0 opening
2 03gDhPWr 3 e5 white 61.0 opening
3 03gDhPWr 4 c5 opening -5.0 opening
4 03gDhPWr 5 Nf3 white 26.0 opening
110093 zzaiRa7s 36 a5+ endgame NaN endgame
110094 zzaiRa7s 37 Kxb5 white NaN endgame
110095 zzaiRa7s 38 c6+ endgame NaN endgame
110096 zzaiRa7s 39 Ka4 white NaN endgame
110097 zzaiRa7s 40 Q@b4# endgame NaN endgame
