pandas DataFrame类别名与数据混杂时如何提取分组类别转换结构
解决方案
这里提供两种实现方式,你可以根据数据量大小选择:
方法1:遍历实现(逻辑直观,适合小数据集)
import pandas as pd # 你的原始数据 df = pd.DataFrame(data={'name':['Category A', 'Subcategory A.A', 'Product A', 'Product B', 'Category B', 'Product C'],'values':["", "", 1,2,"", 3]}) current_categories = [] df['category'] = '' for idx, row in df.iterrows(): if row['values'] == '': # 识别顶级分类,可根据你实际的类别命名规则调整判断条件 if row['name'].startswith('Category '): current_categories = [row['name']] else: current_categories.append(row['name']) else: df.at[idx, 'category'] = ', '.join(current_categories) # 过滤掉类别行,只保留产品数据 result = df[df['values'] != ''].reset_index(drop=True) print(result)
方法2:向量化操作(效率更高,适合万行以上的大数据集)
import pandas as pd df = pd.DataFrame(data={'name':['Category A', 'Subcategory A.A', 'Product A', 'Product B', 'Category B', 'Product C'],'values':["", "", 1,2,"", 3]}) # 标记顶级分类 df['is_top_category'] = (df['values'] == '') & df['name'].str.startswith('Category ') # 按顶级分类分组 df['group_id'] = df['is_top_category'].cumsum() # 每组内拼接所有类别名称 df['category'] = df.groupby('group_id')['name'].transform( lambda x: ', '.join(x[df.loc[x.index, 'values'] == '']) ) # 过滤出产品行 result = df[df['values'] != ''][['name', 'values', 'category']].reset_index(drop=True) print(result)
两种方法运行后得到的result就是你需要的结构:
| name | values | category |
|---|---|---|
| Product A | 1 | Category A, Subcategory A.A |
| Product B | 2 | Category A, Subcategory A.A |
| Product C | 3 | Category B |
如果你的实际业务中顶级分类不是以Category 开头命名的,调整is_top_category的判断规则即可。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

