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

Python中基于出现次数合并DataFrame行并保留唯一值的问题

解决连续相同Name的DataFrame行合并问题

嘿,我来帮你搞定这个需求!你想要的是对连续出现的相同Name行进行分组,统计每组的出现次数,同时把Port和Class列的唯一值合并成逗号分隔的字符串,对吧?

先分析你现有代码的问题

你之前的代码确实实现了连续分组并统计次数,但只保留了每组第一行的Port和Class值,没有处理这两列的唯一值合并,所以输出和期望不符。

完整解决方案

我们可以基于连续分组的思路,结合Pandas的groupby和agg方法,一次性完成所有需求:

步骤1:构造原始DataFrame(方便复现)

import pandas as pd

data = {
    'Name': ['A', 'A', 'B', 'A', 'B'],
    'Category': ['Code', 'Code', 'Math', 'Code', 'Math'],
    'Port': [443, 80, 443, 443, 80],
    'Class': ['string1', 'string2', 'string3', 'string1', 'string4']
}
df = pd.DataFrame(data)

步骤2:创建连续分组的标识

我们用Name列和上一行的比较结果生成分组ID,确保只有连续相同的Name被分到同一组:

df['group_id'] = df['Name'].ne(df['Name'].shift()).cumsum()

步骤3:分组聚合得到目标结果

通过agg方法对每个分组分别处理不同列:

result = df.groupby('group_id').agg(
    # Name和Category取分组内第一个值(连续组内值一致)
    Name=('Name', 'first'),
    Category=('Category', 'first'),
    # Port取唯一值后转字符串用逗号连接
    Port=('Port', lambda x: ', '.join(map(str, x.unique()))),
    # Class取唯一值后用逗号连接
    Class=('Class', lambda x: ', '.join(x.unique())),
    # 统计分组内的行数即出现次数
    Count=('Name', 'size')
).reset_index(drop=True)

最终输出

运行后得到的result就是你期望的格式:

Name Category      Port          Class  Count
0    A     Code  443, 80  string1, string2      2
1    B     Math       443        string3      1
2    A     Code       443        string1      1
3    B     Math        80        string4      1

关键细节说明

  • 对于Port列,我们用map(str, x.unique())把数字类型的唯一值转成字符串,避免连接时出现类型错误;
  • 如果你的数据中,同一连续Name组内的Category可能有不同值,可以把Category的聚合逻辑改成和Port一样的lambda x: ', '.join(x.unique());
  • reset_index(drop=True)是为了去掉临时的group_id列,让结果更整洁。

内容的提问来源于stack exchange,提问作者Pranav101py

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 22:27:48