在Pandas DataFrame中按Class分组整理车辆品牌与车型数据
问题描述
现有包含车辆类别(Class 1-12)、品牌(Make)、车型(Model)的数据集,需生成符合以下要求的表格:
- 同一Class下,相同品牌对应的车型合并展示(用逗号分隔)
- Class列仅在每组首行显示,其余行留空
- 最终输出12类数据的整理结果
此前尝试的代码存在品牌、车型重复显示,保存CSV时Class列丢失的问题,原代码如下:
import pandas as pd import numpy as np from tabulate import tabulate df = pd.read_excel('data.xlsx') #df_size = df.shape df2 = df.drop(['VIN', 'Class Guide Line Item #', 'Asset Type', 'Year', 'Trim','Trim Option 1', 'Trim Option 2','Trim Option 3','Trim Option 4'], axis='columns') df2.drop_duplicates(inplace=True) #print(tabulate(df2, headers="keys", showindex="never", tablefmt="fancy_grid")) df2.head() df3.groupby(['Class']).agg(list) df3.groupby(['Class']).agg(pd.Series.tolist) #df3 = df2.groupby(['Class']).agg(lambda x: list(x)) #print(tabulate(df3, headers="keys", showindex="never", tablefmt="grid")) df3.head() #df3.to_csv('newdata.csv', index=False)
期望输出示例:
Class| Make | Model | Acura| SLX, TLX 1 | Ford | Fusion | Acura| CSX 2 | Ford | F150, Expedition
解决代码
import pandas as pd from tabulate import tabulate # 读取原始数据 df = pd.read_excel('data.xlsx') # 仅保留需要的列并去重,剔除重复的Class-Make-Model组合 df_clean = df[['Class', 'Make', 'Model']].drop_duplicates() # 先按Class和Make分组,将同一品牌下的车型合并为逗号分隔的字符串 grouped = df_clean.groupby(['Class', 'Make'])['Model'].agg(lambda x: ', '.join(x)).reset_index() # 处理Class列:同一Class分组内仅首行保留Class值,其余行设为空字符串 grouped['Class'] = grouped.groupby('Class')['Class'].transform(lambda x: x.iloc[0] if x.name == x.iloc[0] else '') # 打印预览表格 print(tabulate(grouped, headers='keys', showindex=False, tablefmt='grid')) # 保存整理后的数据到CSV grouped.to_csv('newdata.csv', index=False)
关键说明
- 去重处理:直接筛选核心列后去重,避免无关数据干扰后续分组
- 双层分组:先按
Class+Make分组合并车型,解决同品牌车型重复的问题 - Class列格式化:用
transform方法实现同一Class组仅首行显示类别值,其余行留空 - CSV保存:
index=False确保Class列不会丢失,空值以空字符串形式保留,符合预期格式
内容的提问来源于stack exchange,提问作者joedady16
相关产品推荐
相关产品推荐

