如何按重复频次整理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内置的向量化操作替代手动遍历,可大幅提升百万级数据的处理效率,具体方案如下:
核心思路
- 将
phone1和phone2列融合为单列,统一收集所有电话号码 - 按
id分组,提取每组的唯一电话号码并按出现频率排序(匹配示例结果的号码顺序) - 将分组后的号码列表拆分为多列,重命名为规范的
phoneX格式 - 重置索引得到最终宽格式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
相关产品推荐
相关产品推荐

