Pandas如何将列中唯一值转置为新列完成dataframe结构转换
问题原因
直接调用pivot得到不符合预期的结果,核心原因是原始数据是无显式分组标识的长表结构:每连续5行对应1条完整交易记录,但没有字段标记哪些行归属同一条交易,pivot默认按原索引逐行匹配列值,就会生成大量空值。
实现方法
不需要复杂的groupby聚合,按以下逻辑操作即可:
- 给每条交易生成唯一分组ID:根据数据规律,每条交易固定以
Date of transaction开头,既可以按固定5行的规律快速分组,也可以通过识别起始行生成适配不规则数据的分组ID,同时保留每组第一行的原索引,匹配你预期结果的行号。 - 执行透视转换:以分组ID为行索引、c1字段值为列名、c2字段值为单元格内容做透视,最后调整列顺序、清除多余轴标签即可。
完整可运行代码
import pandas as pd import numpy as np # 构造原始示例数据 df = pd.DataFrame({ 'c1': ['Date of transaction','Deposit amount','Withdrawal amount','Balance','Comments', 'Date of transaction','Deposit amount','Withdrawal amount','Balance','Comments'], 'c2': ['2021-04-26','10,000',np.nan,'10,000','store_a', '2021-04-26','20,000',np.nan,'21,000','store_b'] }) # 通用分组逻辑:每次遇到交易日期行就记为新分组,不依赖固定行数 df['record_id'] = (df['c1'] == 'Date of transaction').cumsum() - 1 # 提取每组第一行的原索引,作为最终结果的行号 target_index = df.groupby('record_id').apply(lambda x: x.index[0]).values # 透视转宽表 result = df.pivot(index='record_id', columns='c1', values='c2') # 调整行索引、列顺序,匹配预期格式 result.index = target_index result = result[['Date of transaction','Deposit amount','Withdrawal amount','Balance','Comments']] result.columns.name = None print(result)
输出结果
Date of transaction Deposit amount Withdrawal amount Balance Comments 0 2021-04-26 10,000 NaN 10,000 store_a 5 2021-04-26 20,000 NaN 21,000 store_b
内容的提问来源于stack exchange,提问作者superccccc
相关产品推荐
相关产品推荐

