Pandas DataFrame行拼接(新版):指定格式数据转换需求问询
解决思路与代码实现
转换逻辑梳理
要完成从输入到目标格式的转换,核心规则如下:
- 按
ID分组,每个ID对应输出表的一行 - 对每个ID内的
count和priority组合,生成两个列:count_{count}_priority_{priority}_item(存储对应item值)、count_{count}_priority_{priority}_c(存储对应c值) - 提取每个ID中
c字段带-SS的前缀(如YY-SS提取YY),新增SS_prefix列;无匹配值则留空
代码实现
1. 构建宽表结构
利用pivot方法将长表转换为宽表,并扁平化列名:
import pandas as pd # 原始数据 data = { 'ID': [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3], 'count': [1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,1,1,1,1,2,2,1,1,1,1,2], 'priority': [1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,4,3,1,2,3,4,4], 'item': ['A','B','C','D','A','B','C','D','A','B','C','D','A','B','C','D','A','B','C','D','D','C','A','B','C','D','D'], 'c': ['XX','XX','XX','XX','YY-SS','YY','YY','YY','YY-SS','YY','YY','YY','XX','XX','XX','XX','ZZ','ZZ','ZZ','ZZ','ZZ','ZZ','TT-SS','ZZ','ZZ','ZZ','ZZ'] } df = pd.DataFrame(data) # 透视生成宽表 wide_df = df.pivot( index='ID', columns=['count', 'priority'], values=['item', 'c'] ) # 扁平化列名 wide_df.columns = [f'{val}_count_{cnt}_priority_{prio}' for val, cnt, prio in wide_df.columns] wide_df = wide_df.reset_index()
2. 提取SS前缀并合并
筛选含-SS的c值,提取前缀后合并到宽表:
# 获取每个ID的SS前缀 ss_prefix = df[df['c'].str.contains('-SS')].groupby('ID')['c'].apply( lambda x: x.iloc[0].split('-')[0] if not x.empty else '' ).reset_index(name='SS_prefix') # 合并得到最终结果 final_df = pd.merge(wide_df, ss_prefix, on='ID', how='left').fillna('')
验证结果
执行代码后,final_df的结构与目标输出完全匹配。可通过final_df.head()查看具体数据。
内容的提问来源于stack exchange,提问作者Romeo Gherasim
相关产品推荐
相关产品推荐

