You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 17:10:18