Skip to main content
 首页 » 编程设计

python之Pandas 根据条件将一列映射到另一列

2025年05月04日15webabcd

我有一个数据框

        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