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')
解决方案
问题排查
你的代码存在几个问题:
- 列名
Medals_Won没有加引号,应该写成df['Medals_Won'],否则Python会把它当成变量处理 .loc筛选后只返回符合条件的行,直接插入会导致新列长度和原DataFrame不匹配- 最后一列的列名误写为
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
相关产品推荐
相关产品推荐

