如何在Pandas DataFrame的两列中统计唯一组合的数量
解决Pandas无序列组合的计数问题
你遇到的核心问题是:默认的groupby会把(col1, col2)和(col2, col1)当成不同的组合统计,但你需要将这类无序组合视为同一个来计算出现次数。下面是具体的解决思路和代码实现:
思路解析
要实现无序组合的计数,关键是先把每一行的两个列值统一为有序形式(比如把(2,1)转换成(1,2)),让原本无序的组合变成一致的分组键,再进行统计就能得到正确结果。
具体代码实现
方案1:简洁直观的apply处理
适合小数据集,代码可读性强:
import pandas as pd # 原始DataFrame df = pd.DataFrame({'col1': [1,2,4,3], 'col2': [2,1,3,4]}) # 对每行的col1和col2排序,生成统一的有序列 df[['sorted_col1', 'sorted_col2']] = df.apply( lambda row: pd.Series(sorted([row['col1'], row['col2']])), axis=1 ) # 基于有序列分组统计,并重命名列得到最终结果 result = (df.groupby(['sorted_col1', 'sorted_col2']) .size() .reset_index(name='count') .rename(columns={'sorted_col1': 'col1', 'sorted_col2': 'col2'})) print(result)
输出结果:
col1 col2 count 0 1 2 2 1 3 4 2
方案2:高效的向量化处理(适合大数据集)
如果你的DataFrame行数较多,apply的效率可能不足,可以用numpy的向量化排序操作,速度更快:
import pandas as pd import numpy as np df = pd.DataFrame({'col1': [1,2,4,3], 'col2': [2,1,3,4]}) # 用numpy对每行的两列值进行排序 sorted_vals = np.sort(df[['col1', 'col2']], axis=1) df[['sorted_col1', 'sorted_col2']] = sorted_vals # 分组统计并整理结果 result = (df.groupby(['sorted_col1', 'sorted_col2']) .size() .reset_index(name='count') .rename(columns={'sorted_col1': 'col1', 'sorted_col2': 'col2'}))
这个方法利用numpy的底层优化,比apply的循环处理效率提升明显。
内容的提问来源于stack exchange,提问作者Aditi Agrawal
相关产品推荐
相关产品推荐

