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

