Python中多Pandas DataFrame有序元素全局频率计算最佳实践
模型排序频率统计方案
核心需求
- 针对1000个对应user1user1000的DataFrame(df1df1000),按指定指标(如MAE)对每个DataFrame的Models列排序
- 统计所有排序后的模型列表的绝对出现次数(counts)和相对占比(freq(%)),按次数排序
- 保留每个排序对应的用户标识
分步实现代码
1. 生成带用户标识的排序模型列表
先把所有DataFrame存入字典(方便按用户标识索引),遍历每个用户的DataFrame,按指定指标排序后提取模型名称,转成元组(列表不可哈希,无法作为统计键),同时记录用户ID:
import pandas as pd from collections import Counter # 假设已将所有df存入字典,键为user标识,值为对应DataFrame user_dfs = {f'user{i}': globals()[f'df{i}'] for i in range(1, 1001)} # 指定排序指标,比如MAE(越小越好,用ascending=True;若为R²则用ascending=False) target_metric = 'MAE' sorted_model_records = [] for user_id, df in user_dfs.items(): sorted_df = df.sort_values(by=target_metric, ascending=True) sorted_models = tuple(sorted_df['Models'].tolist()) sorted_model_records.append({'user_id': user_id, 'sorted_models': sorted_models}) # 转成DataFrame方便后续处理 records_df = pd.DataFrame(sorted_model_records)
2. 统计排序顺序的频率
用Counter统计元组的出现次数,再计算相对频率:
# 统计每个排序序列的绝对次数 sorted_counts = Counter(records_df['sorted_models']) # 转成结果DataFrame result_df = pd.DataFrame.from_dict(sorted_counts, orient='index', columns=['counts']) result_df.index.name = 'sorted_model_sequence' # 计算相对频率(占比) total_records = len(records_df) result_df['freq(%)'] = (result_df['counts'] / total_records) * 100 # 按绝对次数降序排序 result_df = result_df.sort_values(by='counts', ascending=False).reset_index() # 关联对应用户标识 user_mapping = records_df.groupby('sorted_models')['user_id'].apply(list).reset_index() final_result = pd.merge(result_df, user_mapping, on='sorted_models')
3. 输出结果
直接打印或保存为文件:
print(final_result) # 保存为CSV文件 final_result.to_csv('model_sequence_frequency.csv', index=False)
TF-IDF方法的适用性分析
TF-IDF(通过sklearn.TfidfVectorizer)不适合解决这个问题,原因如下:
- TF-IDF核心是统计单个元素(这里是单个模型)在序列中的词频与逆序列频率,关注的是单个元素的重要性,而非整个序列的顺序和完整性
- 我们的需求是统计有序模型列表作为整体的出现频率,TF-IDF无法识别序列的顺序差异(比如["A","B"]和["B","A"]会被视为包含相同元素的序列,TF-IDF值一致,但实际是完全不同的排序)
内容的提问来源于stack exchange,提问作者Mario
相关产品推荐
相关产品推荐

