如何基于某列值透视表格?Pandas DataFrame转换求助
问题描述
现有如下Pandas DataFrame:
import pandas as pd dataframe = pd.DataFrame({'col1': ['Name', 'Location', 'Phone','Name', 'Location'], 'Values': ['Mark', 'New York', '656','John', 'Boston']})
其显示形式为:
col1 Values 0 Name Mark 1 Location New York 2 Phone 656 3 Name John 4 Location Boston
可见目标列名存储在col1列中,且部分数据缺少Phone值,希望将其转换为如下格式:
Name Location Phone 0 Mark New York 656 1 John Boston NaN
已尝试Excel转置、pivot及pivot_table方法:
pivoted = pd.pivot_table(data = dataframe, values='Values', columns='col1')
但结果不符合预期,寻求解决方法。
注:每组数据以Name开头,下一个Name前结束。
解决方法
核心思路是先给每组数据分配唯一分组ID,再基于分组ID完成透视转换:
生成分组标识符
标记所有col1为Name的行,通过累加计数生成分组ID,再将ID填充到同组的其他行:# 标记Name行并生成分组ID dataframe['group_id'] = (dataframe['col1'] == 'Name').cumsum()透视转换为目标格式
以group_id为索引、col1为列、Values为值执行透视,最后重置索引并清理列名层级:result = dataframe.pivot(index='group_id', columns='col1', values='Values').reset_index(drop=True) # 移除不必要的列名层级 result.columns.name = None
执行后得到的结果即为预期格式:
Name Location Phone 0 Mark New York 656 1 John Boston NaN
补充说明
cumsum()会在每次遇到Name行时累加计数,自动将连续行划分为独立分组;- 同组内的所有行通过填充获得相同分组ID,确保透视时同组字段能归到同一行;
- 即使新增其他字段(如Email),只要分组仍以
Name开头,该方法依然有效。
内容的提问来源于stack exchange,提问作者CatDad
相关产品推荐
相关产品推荐

