如何在Rust Polars DataFrame中聚合列表顶部值并关联回原表
解决方案
假设你的measurements DataFrame结构如下(对应你提到的观测列表结构):
import pandas as pd measurements = pd.DataFrame({ 'reader': ['Alice', 'Bob', 'Alice'], 'sights': [['deer', 'fox', 'deer', 'rabbit'], ['fox', 'fox', 'bear'], ['rabbit', 'rabbit', 'deer']] })
实现步骤:
- 展开观测列表:用
explode()把sights列的列表拆分为每行对应一个动物记录:
exploded = measurements.explode('sights').rename(columns={'sights': 'animal'})
- 统计读者的动物观测次数:按
reader和animal分组,计算每种动物的观测总数:
counts = exploded.groupby(['reader', 'animal']).size().reset_index(name='sight_count')
- 筛选每个读者的前2高频动物:按观测次数降序排序后,取每组前2条记录:
top_sights = counts.sort_values(['reader', 'sight_count'], ascending=[True, False])\ .groupby('reader').head(2)
- 整理结果并合并回原表:将每个读者的前2动物转为指定格式(比如字典),再合并到原DataFrame:
# 把结果整理成「动物: 观测次数」的字典格式 top_sights_dict = top_sights.groupby('reader')\ .apply(lambda x: x.set_index('animal')['sight_count'].to_dict())\ .reset_index(name='top_sights') # 合并回原表,保留所有原始行 measurements = measurements.merge(top_sights_dict, on='reader', how='left')
最终measurements的top_sights字段会存储目标结果,比如Alice的结果为{'deer': 3, 'rabbit': 3},Bob的结果为{'fox': 2, 'bear': 1}。
并列排名处理补充:
如果需要严格处理次数并列的场景(比如同次数动物都算前2),可以用rank()生成排名后筛选:
counts['rank'] = counts.groupby('reader')['sight_count'].rank(ascending=False, method='dense') top_sights = counts[counts['rank'] <= 2]
内容的提问来源于stack exchange,提问作者sebosp
相关产品推荐
相关产品推荐

