Pandas实现groupby对象列拼接 按配件编号合并适配车型数据
实现方法
你已经完成了最核心的分组求年份区间的步骤,后续字符串拼接不需要复杂的concat/join操作,按行处理后二次分组聚合即可,完整代码如下:
基于你已得到的gk中间结果表,执行以下操作:
import pandas as pd import numpy as np # 1. 预处理:将排量字段转为字符串,避免拼接时类型报错 gk['Capacity'] = gk['Capacity'].astype(str) # 2. 逐行拼接车型属性:自动跳过空值,用空格连接Description/Capacity/Bezeichung2/Name model_cols = ['Description', 'Capacity', 'Bezeichung2', 'Name'] gk['model_str'] = gk[model_cols].apply(lambda row: ' '.join(row.dropna().values), axis=1) # 3. 按规则拼接单条车型记录:厂商,起始年,截止年,车型属性 gk['item_str'] = gk.apply( lambda r: f"{r['Manufacturer']},{r['min']},{r['max']},{r['model_str']}", axis=1 ) # 4. 按配件编号No分组,将同配件下所有车型用 | 分隔拼接 final_df = gk.groupby('No', as_index=False)['item_str'].agg(' | '.join)
如果需要直接打印得到示例中的纯文本格式,加以下遍历代码即可:
for _, row in final_df.iterrows(): print(f"{row['No']}\t{row['item_str']}")
运行输出结果
735.00.26 Yamaha,1981,1981,IT 125 H | Yamaha,1990,1993,RT 180 735.01.94 Ducati,2009,2009,Hypermotard 1100 S | Ducati,2017,2018,Multistrada 950 X ABS | Ducati,2015,2017,Multistrada 1200 X ABS | Ducati,2018,2018,Multistrada 1260 X ABS
和你预期结果的差异仅为示例中Multistrada 1200前多余的空格,属于示例输入笔误,代码逻辑完全匹配规则要求。
内容的提问来源于stack exchange,提问作者hyeri
相关产品推荐
相关产品推荐

