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

如何按重复频次整理DataFrame字段并去除重复项?

问题描述

现有如下DataFrame数据:

id phone1 phone2 
1  300    301
1  303    300
1  300    303
2  400    401

期望得到如下结果:

id phone1 phone2 phone3
1  300    303    301
2  400    401

此前尝试按id分别与phone1、phone2分组统计计数,再通过遍历列表重组DataFrame,但该方法处理百万级数据时速度极慢。尝试的代码如下:

dataframe1 = dataframe.groupby(['id', 'phone1']).count().reset_index()
dataframe2 = dataframe.groupby(['id', 'phone2']).count().reset_index()

得到的中间结果:

id phone1 phone2
1  300    2    
1  303    1
2  401    1

id phone1 phone2
1  300    1   
1  301    1
1  303    1
2  400    1

寻求高效的实现方法。

高效实现方法

利用pandas内置的向量化操作替代手动遍历,可大幅提升百万级数据的处理效率,具体方案如下:

核心思路

  1. 将phone1和phone2列融合为单列,统一收集所有电话号码
  2. 按id分组,提取每组的唯一电话号码并按出现频率排序(匹配示例结果的号码顺序)
  3. 将分组后的号码列表拆分为多列,重命名为规范的phoneX格式
  4. 重置索引得到最终宽格式DataFrame

代码示例

import pandas as pd

# 构造原始数据
df = pd.DataFrame({
    'id': [1, 1, 1, 2],
    'phone1': [300, 303, 300, 400],
    'phone2': [301, 300, 303, 401]
})

# 1. 融合列,收集所有电话号码
melted_df = df.melt(id_vars='id', value_name='phone').drop(columns='variable')

# 2. 按id分组,提取唯一号码并按出现频率降序排序
grouped = melted_df.groupby('id')['phone'].agg(lambda x: x.value_counts().index.tolist())

# 3. 拆分列表为多列,重命名列名
result = grouped.apply(pd.Series).rename(columns=lambda idx: f'phone{idx+1}').reset_index()

# 可选:将NaN替换为空字符串(按需处理)
# result = result.fillna('')

print(result)

输出结果

id  phone1  phone2  phone3
0   1     300     303     301
1   2     400     401     NaN

性能说明

该方案全程依赖pandas底层C语言实现的向量化操作,避免了Python层面的循环遍历,处理百万级数据时的效率远高于手动遍历重组的方式,能有效降低运行时间。

内容的提问来源于stack exchange,提问作者Kevin Yorney Guzman Hernandez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:25:22