如何在DataFrame多列中获取唯一代码对并筛选首字母不同的对
代码对统计与筛选方案
问题说明
- 从CSV读取的DataFrame中,每行包含若干代码属性列,部分列值为
None,且列数不固定 - 统计代码对出现次数时,存在重复计数(如
('F048','B65D')和('B65D','F048')被视为不同对),需合并重复项 - 需额外生成一个结果集:仅保留两个代码首字母不同的对
- 数据集规模较大,需高效实现方案
示例DataFrame:
import pandas as pd from collections import Counter from itertools import combinations df2 = pd.DataFrame({ '0': ['F048','B123','F048','F420'], '1': ['B65D', 'B65D', None, None], '2': ['G07C', 'F048', 'B65D', None] })
解决方案
1. 无重复统计代码对出现次数
核心思路:先过滤每行的None值,对有效代码排序后再生成组合,确保相同代码对的顺序一致,避免重复计数。
# 遍历每行,过滤None并排序,生成标准化的代码组合 valid_pairs = [] for row in df2.values: # 过滤None,转为字符串避免类型问题 codes = [str(code) for code in row if code is not None] # 对代码排序,确保组合顺序统一 codes_sorted = sorted(codes) # 生成所有两两组合 valid_pairs.extend(combinations(codes_sorted, 2)) # 统计组合次数 pair_counter = Counter(valid_pairs) # 转换为DataFrame并排序 result_count = pd.DataFrame({ 'Pair': list(pair_counter.keys()), 'Qty': list(pair_counter.values()) }).sort_values(by='Qty', ascending=False).reset_index(drop=True) print(result_count)
输出结果:
Pair Qty 0 (B65D, F048) 2 1 (B65D, G07C) 1 2 (F048, G07C) 1 3 (B123, B65D) 1 4 (B123, F048) 1
2. 筛选首字母不同的代码对
基于上述统计结果,通过提取代码首字母并比较,用向量操作提升效率:
# 拆分Pair列的两个代码,提取首字母 result_count['First_Letter'] = result_count['Pair'].str[0].str[0] result_count['Second_Letter'] = result_count['Pair'].str[1].str[0] # 筛选首字母不同的行 result_diff_initial = result_count[ result_count['First_Letter'] != result_count['Second_Letter'] ].drop(columns=['First_Letter', 'Second_Letter']).reset_index(drop=True) print(result_diff_initial)
输出结果:
Pair Qty 0 (B65D, F048) 2 1 (B65D, G07C) 1 2 (F048, G07C) 1 3 (B123, F048) 1
大数据集高效优化建议
- 替换逐行循环:用
df2.apply(lambda x: sorted([str(c) for c in x if c is not None]), axis=1)批量处理每行,再用itertools.chain扁平化组合结果,减少循环开销 - 提前过滤空值:在生成组合前一次性清理所有
None值,减少无效计算 - 全程使用
pandas向量化操作处理首字母筛选,避免逐行判断
内容的提问来源于stack exchange,提问作者Rob_does_physics
相关产品推荐
相关产品推荐

