You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将DataFrame中互换列值的行视为同一组进行分组?

解决Pandas中名称互换行的分组统计问题

嘿,这个分组的小坑我太熟了!你遇到的问题核心在于,groupby(['Name1','Name2'])是严格按照列的顺序来识别分组键的——也就是说(A,B)和(B,A)会被当成完全不同的两组,自然统计出来的count就不对。下面给你几个实用的解决办法:

方法一:生成排序后的统一分组键(通用型)

我们可以给每行的Name1和Name2做个排序,生成一个顺序固定的组合(比如元组),用这个新的组合来分组,就能把互换的行归为同一组了:

# 对每行的两个名称排序,生成元组作为统一键
df['sorted_pair'] = df.apply(lambda row: tuple(sorted([row['Name1'], row['Name2']])), axis=1)
# 用新键分组统计数量,把结果映射回原DataFrame
df['Count'] = df.groupby('sorted_pair')['Name1'].transform('size')
# 可选:如果不需要临时列,最后删掉它
df = df.drop('sorted_pair', axis=1)

这个方法逻辑直观,不管你的名称是字符串还是其他可排序类型都能用,小数据集下用起来很顺手。

方法二:用Numpy批量排序(高效型)

如果你的数据集比较大,apply的逐行处理可能有点慢,这时候可以用Numpy的向量化操作来批量排序,速度会快很多:

import numpy as np

# 对Name1和Name2列按行排序,得到顺序统一的二维数组
sorted_names = np.sort(df[['Name1', 'Name2']], axis=1)
# 把排序后的结果转成DataFrame的临时列
df[['sorted_name1', 'sorted_name2']] = sorted_names
# 用这两个有序列分组统计
df['Count'] = df.groupby(['sorted_name1', 'sorted_name2'])['Name1'].transform('size')
# 可选:清理临时列
df = df.drop(['sorted_name1', 'sorted_name2'], axis=1)

Numpy的向量化操作比apply快得多,处理十万级以上的数据时优势很明显。

方法三:直接在groupby中处理(极简型)

如果你不想生成临时列,也可以直接在groupby的参数里完成排序键的生成,一行代码搞定:

df['Count'] = df.groupby(
    df.apply(lambda row: tuple(sorted([row['Name1'], row['Name2']])), axis=1)
)['Name1'].transform('size')

这个写法简洁,但本质和方法一一样,大数据集下还是推荐方法二。

补充说明

不管用哪种方法,核心都是让互换的名称生成完全相同的分组键,这样groupby就能把它们识别为同一组了。如果你的名称是字符串,排序是按字典序来的,但这完全不影响分组结果——只要两个名称是同一对,排序后的结果就一定一致。

内容的提问来源于stack exchange,提问作者LiL_Python_User

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 18:47:51