You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas实现:将DataFrame列值拆分至多个独立列

问题:拆分DataFrame的奖牌列生成多列

现有包含Teams、Year、Medals_Won三列的DataFrame,数据如下:

Teams   Year    Medals_Won
A       2009    Gold
A       2010    Silver
A       2011    Silver
A       2012    Bronze
A       2013    Gold
B       2009    Bronze
B       2010    Gold
B       2011    Bronze
B       2012    Silver
B       2013    Silver
C       2009    Silver
C       2010    Bronze
C       2011    Gold
C       2012    Gold
C       2013    Bronze

需要将Medals_Won列按奖牌类型拆分,保持前两列的行数和顺序不变,得到如下格式的DataFrame(缺失值为Null/NaN):

Teams   Year    Gold_Winner  Silver_Winner  Bronze_Winner
A       2009    Gold         Null           Null
A       2010    Null         Silver         Null
A       2011    Null         Silver         Null
A       2012    Null         Null           Bronze
A       2013    Gold         Null           Null
B       2009    Null         Null           Bronze
B       2010    Gold         Null           Null
B       2011    Null         Null           Bronze
B       2012    Null         Silver         Null
B       2013    Null         Silver         Null
C       2009    Null         Silver         Null
C       2010    Null         Null           Bronze
C       2011    Gold         Null           Null
C       2012    Gold         Null           Null
C       2013    Null         Null           Bronze

尝试用insert结合.loc实现但失败,代码如下:

df.insert(2, 'Gold_Won', df.loc[df[Medals_Won] == 'Gold')
df.insert(3, 'Silver_Won', df.loc[df[Medals_Won] == 'Silver')
df.insert(4, 'Silver_Won', df.loc[df[Medals_Won] == 'Bronze')

解决方案

问题排查

你的代码存在几个问题:

  1. 列名Medals_Won没有加引号,应该写成df['Medals_Won'],否则Python会把它当成变量处理
  2. .loc筛选后只返回符合条件的行,直接插入会导致新列长度和原DataFrame不匹配
  3. 最后一列的列名误写为Silver_Won,应该是Bronze_Won

方法一:用numpy.where生成新列(新手友好)

针对每种奖牌类型,判断当前行是否匹配,匹配则填入奖牌名称,否则填NaN:

import pandas as pd
import numpy as np

# 构造原始DataFrame(已有数据可跳过)
data = {
    'Teams': ['A']*5 + ['B']*5 + ['C']*5,
    'Year': [2009,2010,2011,2012,2013]*3,
    'Medals_Won': ['Gold','Silver','Silver','Bronze','Gold',
                   'Bronze','Gold','Bronze','Silver','Silver',
                   'Silver','Bronze','Gold','Gold','Bronze']
}
df = pd.DataFrame(data)

# 生成三个目标列
df['Gold_Winner'] = np.where(df['Medals_Won'] == 'Gold', 'Gold', np.nan)
df['Silver_Winner'] = np.where(df['Medals_Won'] == 'Silver', 'Silver', np.nan)
df['Bronze_Winner'] = np.where(df['Medals_Won'] == 'Bronze', 'Bronze', np.nan)

# 调整列顺序(可选,按需调整)
df = df[['Teams', 'Year', 'Gold_Winner', 'Silver_Winner', 'Bronze_Winner']]

方法二:用pd.get_dummies快速生成(简洁高效)

利用哑变量生成工具一键拆分,再替换值得到目标格式:

import pandas as pd
import numpy as np

# 构造原始DataFrame(已有数据可跳过)
data = {
    'Teams': ['A']*5 + ['B']*5 + ['C']*5,
    'Year': [2009,2010,2011,2012,2013]*3,
    'Medals_Won': ['Gold','Silver','Silver','Bronze','Gold',
                   'Bronze','Gold','Bronze','Silver','Silver',
                   'Silver','Bronze','Gold','Gold','Bronze']
}
df = pd.DataFrame(data)

# 生成哑变量列
dummies = pd.get_dummies(df['Medals_Won'])
# 将1替换为对应奖牌名,0替换为NaN
dummies = dummies.apply(lambda col: col.replace(1, col.name).replace(0, np.nan))
# 重命名列名
dummies.columns = [f'{col}_Winner' for col in dummies.columns]
# 合并到原DataFrame
df = pd.concat([df[['Teams', 'Year']], dummies], axis=1)

两种方法都能得到你需要的结果,方法一逻辑清晰适合理解,方法二代码更简洁。


内容的提问来源于stack exchange,提问作者ledzed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 15:10:22