如何在Pandas中按Name分组合并行并按优先级确定Severity字段?
Pandas按条件分组聚合:拼接Country并按优先级取最高Severity
问题场景
现有数据集如下:
Name Source Country Severity ABC XYZ USA Low DEF XYZ England High ABC XYZ India Medium EFG XYZ Algeria High DEF XYZ UK Medium
需求:按Name字段分组,将Country列的行值拼接为逗号分隔的字符串;同时Severity字段按High>Medium>Low的优先级取分组内最高等级。期望输出:
Name Source Country Severity ABC XYZ USA, India Medium DEF XYZ England, UK High EFG XYZ Algeria High
目前已实现前3列的聚合,但Severity字段的优先级取值逻辑未完成,现有代码:
df = df.groupby('Name').agg({'source':'first', 'Country': ', '.join })
解决方案
核心思路是先给Severity定义优先级映射,将文本转换为可比较的数值,再通过聚合找到分组内优先级最高的等级。
方法一:自定义聚合函数
import pandas as pd # 构造测试数据(已有数据集可跳过此步) data = { 'Name': ['ABC', 'DEF', 'ABC', 'EFG', 'DEF'], 'Source': ['XYZ', 'XYZ', 'XYZ', 'XYZ', 'XYZ'], 'Country': ['USA', 'England', 'India', 'Algeria', 'UK'], 'Severity': ['Low', 'High', 'Medium', 'High', 'Medium'] } df = pd.DataFrame(data) # 定义Severity优先级映射:数值越大优先级越高 severity_priority = {'Low': 0, 'Medium': 1, 'High': 2} # 自定义聚合函数:返回分组内优先级最高的Severity def get_top_severity(series): max_rank = series.map(severity_priority).max() return next(k for k, v in severity_priority.items() if v == max_rank) # 执行分组聚合 result_df = df.groupby('Name').agg({ 'Source': 'first', 'Country': ', '.join, 'Severity': get_top_severity }).reset_index() print(result_df)
方法二:通过临时优先级列实现
import pandas as pd # 构造测试数据(已有数据集可跳过此步) data = { 'Name': ['ABC', 'DEF', 'ABC', 'EFG', 'DEF'], 'Source': ['XYZ', 'XYZ', 'XYZ', 'XYZ', 'XYZ'], 'Country': ['USA', 'England', 'India', 'Algeria', 'UK'], 'Severity': ['Low', 'High', 'Medium', 'High', 'Medium'] } df = pd.DataFrame(data) # 定义Severity优先级映射 severity_priority = {'Low': 0, 'Medium': 1, 'High': 2} # 添加临时列存储优先级数值 df['severity_rank'] = df['Severity'].map(severity_priority) # 分组聚合,先取最高优先级数值 result_df = df.groupby('Name').agg({ 'Source': 'first', 'Country': ', '.join, 'severity_rank': 'max' }).reset_index() # 将优先级数值转换回原始Severity文本 result_df['Severity'] = result_df['severity_rank'].map({v: k for k, v in severity_priority.items()}) # 删除临时列 result_df = result_df.drop('severity_rank', axis=1) print(result_df)
两种方法都能得到符合需求的输出,可根据个人习惯选择。
内容的提问来源于stack exchange,提问作者akshay nivate
相关产品推荐
相关产品推荐

