基于条件实现Pandas中列间数据迁移与替换
Pandas DataFrame 按条件修改列值解决方案
需求
- 当
Result列值为'W'时,将对应行的Winning Odds值替换到Result列 - 当
Result列值为'L'或'P'(不区分大小写)时,将Result列值替换为-1
初始数据
import pandas as pd data = {'Name':['Kauto Star', 'Denman', 'Frankel', 'Desert Orchid'], 'Result':['W', 'L', 'W', 'p'], 'Winning Odds': [4, 5, 6, 7]} df = pd.DataFrame(data)
初始表格:
| 索引 | Name | Result | Winning Odds |
|---|---|---|---|
| 0 | Kauto Star | W | 4 |
| 1 | Denman | L | 5 |
| 2 | Frankel | W | 6 |
| 3 | Desert Orchid | P | 7 |
现有代码问题
尝试的代码逻辑完全错误,将非'W'的行直接替换为Winning Odds的值,不符合需求:
df['Result'] = np.where((df['Result'] == 'W'), df['Result'], df['Winning Odds'])
执行后错误结果:
| 索引 | Name | Result | Winning Odds |
|---|---|---|---|
| 0 | Kauto Star | W | 4 |
| 1 | Denman | 5 | 5 |
| 2 | Frankel | W | 6 |
| 3 | Desert Orchid | 7 | 7 |
正确解法
方法1:嵌套np.where(简洁)
先统一Result列的大小写,避免小写'p'不匹配的问题,再用嵌套条件实现替换:
import numpy as np # 统一大小写,避免大小写不一致导致的匹配失败 df['Result'] = df['Result'].str.upper() # 嵌套条件完成替换 df['Result'] = np.where( df['Result'] == 'W', df['Winning Odds'], np.where(df['Result'].isin(['L', 'P']), -1, df['Result']) )
方法2:loc分步处理(直观易读)
通过loc精准定位行和列,分步处理不同条件:
# 统一大小写 df['Result'] = df['Result'].str.upper() # 替换W对应的Winning Odds值 df.loc[df['Result'] == 'W', 'Result'] = df.loc[df['Result'] == 'W', 'Winning Odds'] # 替换L/P为-1 df.loc[df['Result'].isin(['L', 'P']), 'Result'] = -1
最终结果
执行后得到符合期望的表格:
| 索引 | Name | Result | Winning Odds |
|---|---|---|---|
| 0 | Kauto Star | 4 | 4 |
| 1 | Denman | -1 | 5 |
| 2 | Frankel | 6 | 6 |
| 3 | Desert Orchid | -1 | 7 |
内容的提问来源于stack exchange,提问作者liambh
相关产品推荐
相关产品推荐

