Pandas按日期统计唯一Maid(仅保留首次出现记录)及大数据量性能优化方案
高效处理百万级数据集:统计Maid首次出现日期
这个问题在处理大规模数据集时很常见——你的循环方法在小数据上没问题,但百万级行的话,Python循环和逐次isin检查的开销会让速度慢到不可接受。这里有个完全矢量化的高效方案,利用pandas的内置优化来处理:
核心思路
我们只需要保留每个Maid首次出现的记录,后续出现的直接丢弃,再基于这些首次记录做统计即可。Pandas的内置函数都是底层优化过的(C实现),比Python循环快几个数量级。
高效代码实现
import pandas as pd # 读取数据时直接解析日期,避免后续转换(更高效) df = pd.read_csv('/home/ubuntu/uniqueSiteId.csv', parse_dates=['date']) # 1. 按日期排序,确保每个Maid的第一行是首次出现的记录 df_sorted = df.sort_values('date') # 2. 保留每个Maid的首次出现记录,自动丢弃后续重复的Maid行 first_occurrences = df_sorted.drop_duplicates(subset='maid', keep='first')[['maid', 'date']] # 如果需要按日期统计当日新增的Maid数量: daily_new_maid_count = first_occurrences.groupby('date').size().reset_index(name='count') # 输出你需要的首次出现记录 print(first_occurrences) # 输出每日新增统计 print(daily_new_maid_count)
为什么这个方法更快?
- 矢量化操作:
sort_values和drop_duplicates都是pandas底层优化的矢量化操作,避免了Python级别的循环,处理百万级数据只需要几秒。 - 时间复杂度优化:排序的时间复杂度是O(n log n),而你的原方法是O(n*d)(d是日期的数量),当n是百万级时,后者的开销会急剧上升。
验证结果
用你提供的示例数据测试,first_occurrences会输出和你预期完全一致的结果:
| maid | date | |
|---|---|---|
| 4 | 104010f8-5f57-4f7c-8ad9-5fc3ec0f9f39 | 2021-08-11 |
| 2 | 0589b8a3-9d33-4db4-b94a-834cc8f46106 | 2021-08-13 |
| 5 | 11947b4a-ccf8-48dc-a6a3-925836b3c520 | 2021-08-13 |
| 0 | 023f1f5f-37fb-4869-a957-b66b111d808e | 2021-08-14 |
而daily_new_maid_count会给出按日期统计的新增Maid数量:
| date | count |
|---|---|
| 2021-08-11 | 1 |
| 2021-08-13 | 2 |
| 2021-08-14 | 1 |
内容的提问来源于stack exchange,提问作者Apricot
相关产品推荐
相关产品推荐

