Pandas实现:将一列值迁移至对应目标列
解决方案
你可以通过分组提取组内元素或者添加类别标识后透视两种方式实现需求,具体代码如下:
方法一:分组后直接提取组内元素
先按Sample分组,提取每个组的Subject列表,再拆分列表到对应列:
import pandas as pd # 构造原始DataFrame data = { 'Sample': ['1-1', '1-1', '1-1', '1-2', '1-2', '1-2'], 'Subject': ['Janet', 'Boston', 'Hat', 'Chris', 'Austin', 'Scarf'], 'Person': ['', '', '', '', '', ''], 'Place': ['', '', '', '', '', ''], 'Thing': ['', '', '', '', '', ''] } df = pd.DataFrame(data) # 分组提取Subject列表 grouped = df.groupby('Sample')['Subject'].agg(list).reset_index() # 构造目标DataFrame result = pd.DataFrame({ 'Sample': grouped['Sample'], 'Subject': grouped['Subject'].str[0], # 取组内第一个Subject作为当前行的Subject值 'Person': grouped['Subject'].str[0], 'Place': grouped['Subject'].str[1], 'Thing': grouped['Subject'].str[2] }) print(result)
方法二:添加类别标识后透视
先给每个Sample组内的行标记对应的类别(Person/Place/Thing),再用透视表重组数据:
import pandas as pd # 构造原始DataFrame data = { 'Sample': ['1-1', '1-1', '1-1', '1-2', '1-2', '1-2'], 'Subject': ['Janet', 'Boston', 'Hat', 'Chris', 'Austin', 'Scarf'], 'Person': ['', '', '', '', '', ''], 'Place': ['', '', '', '', '', ''], 'Thing': ['', '', '', '', '', ''] } df = pd.DataFrame(data) # 给组内每行添加类别标识(按顺序对应Person/Place/Thing) df['Category'] = df.groupby('Sample').cumcount().map({0: 'Person', 1: 'Place', 2: 'Thing'}) # 透视表重组数据 pivoted = df.pivot(index='Sample', columns='Category', values='Subject').reset_index() # 调整列顺序和名称,匹配目标结构 result = pivoted.rename(columns={'Person': 'Subject'}).assign( Person=pivoted['Person'], Place=pivoted['Place'], Thing=pivoted['Thing'] )[['Sample', 'Subject', 'Person', 'Place', 'Thing']] print(result)
两种方法最终都会输出你需要的DataFrame结构。之前用pivot无效是因为缺少类别标识,没法对应到目标列;添加标识后就能正确透视了。
内容的提问来源于stack exchange,提问作者Heather
相关产品推荐
相关产品推荐

