在Pandas数据框中计算所有成对组合

5
我正在寻找 pandas 中一种简单的方法来计算 2 列之间的所有配对组合。例如:
df
Col1    Col2   Freq
 A        B     1
 B        A     1
 A        C     1
 C        B     1
 C        A     1

期望输出:
Col1    Col2   Freq
 A        B     2
 A        C     2
 C        B     1

感谢。

2
df[['Col1', 'Col2']] = np.sort(df[['Col1', 'Col2']], axis=1); df.groupby(['Col1', 'Col2']).size() - user3483203
这里应该使用sum而不是size: df.groupby(['Col1', 'Col2']).sum().reset_index()。请将其作为答案发布给@user3483203。 - Erfan
这是其他100篇帖子的明显副本。更多的问题是要链接哪一个最好(即那个明显避免了缓慢解决方案的)。 - ALollz
这个问题将first()替换为sum() - Quang Hoang
我认为应该将 frozenset 的答案恢复,它真的是一个好答案。 - oppressionslayer
3个回答

1
你可以尝试:
df2=(df
  .groupby(
       df[["Col1", "Col2"]]
       .apply(lambda x: str(sorted(x)), axis=1)
       )
  .agg({"Col1": "first", "Col2": "first", "Freq": "sum"})
  .reset_index(drop=True)
)

输出:

  Col1 Col2  Freq
0    A    B     2
1    A    C     2
2    C    B     1

1

np.sortgroupby

主要技巧是在仅考虑列'Col1''Col2'时对每一行进行排序。 我使用了一些解包技巧来将排序后的第一列放入x,第二列放入y

我本可以将它们放入自己的列中,但这并不必要,因为groupby允许按外部数组分组。所以我就这么做了。

x, y = np.sort(df[['Col1', 'Col2']].to_numpy(), axis=1).T
df.Freq.groupby([x, y]).sum()

A  B    2
   C    2
B  C    1
Name: Freq, dtype: int64

看起来很好的解决方案,但你能解释一下吗?特别是[groupby([x,y])]让我真的无法理解... - Tickon

0

虽然这显然是其他人的副本,但我不确定以下方法是否已经在某处提到:

s = (df.groupby(['Col1','Col2'])
       .Freq.sum()
       .unstack(-1, fill_value=0)
    )

np.triu(s) + np.triu(s.T,1)

输出:

array([[0, 2, 2],
       [0, 0, 1],
       [0, 0, 0]], dtype=int64)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接