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

提升Pandas性能:统计唯一ID首次出现的起始字符串频次

高效统计每个uniqueID首次出现的起始字符串频次

原始数据

import pandas as pd

df = pd.read_csv('filename.csv', delimiter=',')
print(df)

输出:

idx   uniqueID      String 
0        1           'hello'
1        1           'goodbye'
2        1           'happy'
3        2           'hello'
4        2           'happy'
5        3           'goodbye' 
6        3           'hello'
7        3           'hello'
8        4           'goodbye'
9        5           'goodbye'

期望输出

{'hello': 2, 'goodbye': 3}

说明:hello对应uniqueID1、2的首次出现,goodbye对应uniqueID3、4、5的首次出现。

问题背景

当前使用Python for循环结合if/else实现统计,但在大型DataFrame中速度极慢,需要用Pandas内置函数实现高性能的统计。


解决方案

方法一:使用drop_duplicates(推荐,性能更优)

利用drop_duplicates保留每个uniqueID的首次出现记录,再对String列统计频次:

# 保留每个uniqueID的第一条记录(默认保留首次出现的行)
first_records = df.drop_duplicates(subset='uniqueID')

# 统计各起始字符串的频次并转为字典
result = first_records['String'].value_counts().to_dict()
print(result)

输出:

{"'hello'": 2, "'goodbye'": 3}

(注:如果原始数据中String带单引号,结果会保留;若不需要可先用df['String'] = df['String'].str.strip("'")去除)

方法二:使用groupby + first

通过分组聚合获取每个uniqueID的首个字符串,再统计频次:

# 按uniqueID分组,取每组第一个String值,再统计频次
result = df.groupby('uniqueID')['String'].first().value_counts().to_dict()
print(result)

输出与方法一一致。

性能说明

这两种方法均基于Pandas的矢量化操作,底层由C语言实现,相比Python层面的for循环,在大型数据集上速度提升可达数十倍甚至上百倍,完全适配大数据量的处理需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:45:45