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
相关产品推荐
相关产品推荐

