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

求助:Pandas DataFrame中无序列组合的计数实现方法

嘿,这个需求我之前碰到过,其实核心就是把无序的from和to对统一成相同的标识,再统计次数就行,给你两个实用的方法:

方法1:用Pandas Apply实现(适合小数据集)

先把你的示例数据构造出来:

import pandas as pd

df = pd.DataFrame({
    'from': ['a', 'b', 'c', 'c', 'd'],
    'to': ['b', 'a', 'd', 'd', 'c']
})

接下来我们对每行的from和to进行排序,转成元组(因为列表不能作为分组的键,元组是可哈希的),然后分组计数:

# 生成统一的无序组合键:排序后转元组
df['places'] = df[['from', 'to']].apply(lambda x: tuple(sorted(x)), axis=1)
# 分组统计次数
result = df.groupby('places').size().reset_index(name='count')
# 把元组转成列表,和你要的格式完全匹配
result['places'] = result['places'].apply(list)

print(result)

运行后输出就是你想要的结果:

places  count
0  [a, b]      2
1  [c, d]      3

方法2:用Numpy Sort实现(高效处理大数据)

如果你的数据集很大,apply的效率会偏低,这时候用Numpy的排序会快很多:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'from': ['a', 'b', 'c', 'c', 'd'],
    'to': ['b', 'a', 'd', 'd', 'c']
})

# 用Numpy对每行的两列排序
sorted_pairs = np.sort(df[['from', 'to']].values, axis=1)
# 转成元组列作为分组键
df['places'] = list(map(tuple, sorted_pairs))
# 分组计数并整理格式
result = df.groupby('places').size().reset_index(name='count')
result['places'] = result['places'].apply(list)

print(result)

这个方法的逻辑和第一种一致,但底层用Numpy的向量化操作,速度会比apply快好几倍,适合处理十万行以上的数据集。

补充说明

  • 为什么用元组而不是列表?因为Pandas的groupby要求分组键是可哈希的,而列表是不可哈希的,元组刚好满足这个条件。最后转成列表只是为了和你要的输出格式完全匹配,如果不需要的话可以跳过这一步。
  • 如果你的from和to列是数值类型,这两个方法同样适用,不需要做额外修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:50:28