如何将多dataset的不同类别行分组合并为统一类别行?
嘿,这个需求在数据处理场景里太常见啦!不管你是用Python(Pandas)还是直接操作数据库(SQL),都能轻松实现。核心思路就是先统一类别映射,再通过分组聚合把多行合并成单行汇总数据,我给你拆解下具体步骤:
一、用Python Pandas处理(适合本地数据集)
首先你得先定义一个「类别映射规则」,把需要合并的零散类别对应到统一的名称上,比如针对你提到的dataset2:
import pandas as pd # 定义类别映射字典:把要合并的类别指向统一名称 category_mapping = { 'Malicious damage to property': 'Criminal damage', 'Arson': 'Criminal damage', # 如果还有其他需要合并的类别,直接在这里加键值对就行 } # 读取你的dataset2 df2 = pd.read_csv('dataset2.csv') # 生成统一类别列:有映射的替换成统一名称,没有的保留原类别 df2['unified_category'] = df2['Category'].map(category_mapping).fillna(df2['Category'])
接下来就是分组聚合,把同一统一类别的多行数据合并成单行——具体聚合方式看你需要的「相关信息」是什么:
# 示例:统计每个统一类别的案件数量、总损失金额、平均损失,合并案件描述 aggregated_result = df2.groupby('unified_category').agg( total_cases=('Case_ID', 'count'), # 统计案件总数 total_loss=('Loss_Amount', 'sum'), # 统计总损失金额 avg_loss=('Loss_Amount', 'mean'), # 统计平均损失 case_details=('Case_Description', lambda x: ', '.join(x)) # 合并所有案件描述文本 ).reset_index()
执行完你就得到了每个统一类别对应的单行汇总数据啦~如果有多个数据集,只要给每个数据集都生成unified_category列,再用pd.concat()合并后聚合就行。
二、用SQL处理(适合数据库中的数据集)
如果你是直接操作数据库里的数据集,用CASE WHEN来实现类别统一,再配合GROUP BY聚合:
SELECT -- 先统一类别 CASE WHEN Category IN ('Malicious damage to property', 'Arson') THEN 'Criminal damage' -- 其他需要合并的类别继续加WHEN条件 ELSE Category END AS unified_category, COUNT(Case_ID) AS total_cases, -- 统计案件数 SUM(Loss_Amount) AS total_loss, -- 统计总损失 GROUP_CONCAT(Case_Description SEPARATOR ', ') AS case_details -- 合并案件描述(MySQL语法) FROM dataset2 GROUP BY unified_category;
如果要同时处理多个数据集,可以先把数据集合并再聚合:
WITH combined_data AS ( SELECT Category, Case_ID, Loss_Amount, Case_Description FROM dataset1 UNION ALL SELECT Category, Case_ID, Loss_Amount, Case_Description FROM dataset2 ) SELECT CASE WHEN Category IN ('Malicious damage to property', 'Arson') THEN 'Criminal damage' ELSE Category END AS unified_category, COUNT(Case_ID) AS total_cases, SUM(Loss_Amount) AS total_loss FROM combined_data GROUP BY unified_category;
小提示
- 聚合方式完全看你的需求:除了计数、求和,还可以取均值、最值,甚至合并文本内容(比如把所有案件编号拼在一起)。
- 如果你的「相关信息」是要保留原始行的所有细节但按类别分组展示,Pandas里可以用
groupby把行转成列表:df2.groupby('unified_category')['Case_ID'].apply(list).reset_index()
内容的提问来源于stack exchange,提问作者DylanHig
相关产品推荐
相关产品推荐

