【问题标题】:Count all pairwise in pandas dataframe在熊猫数据框中成对计数
【发布时间】:2020-02-10 23:25:04
【问题描述】:

我正在 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

谢谢

【问题讨论】:

  • df[['Col1', 'Col2']] = np.sort(df[['Col1', 'Col2']], axis=1); df.groupby(['Col1', 'Col2']).size()
  • 它是 sum 而不是 size: df.groupby(['Col1', 'Col2']).sum().reset_index()。将其发布为@user3483203 的答案?
  • 这显然是 100 篇其他帖子的重复。更多的是一个问题,即哪个是最好的链接(即明显避免缓慢解决方案的那个)
  • This questionfirst() 替换为 sum()
  • 我认为frozenset的答案应该被取消删除,这确实是一个很好的答案

标签: python pandas


【解决方案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

【讨论】:

    【解决方案2】:

    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])”真的让我难以捉摸......
    【解决方案3】:

    虽然这显然是其他人的重复,但我不确定是否在某处提到了以下方法:

    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)
    

    【讨论】:

      猜你喜欢
      • 2015-01-28
      • 1970-01-01
      • 2020-03-12
      • 2022-11-18
      • 1970-01-01
      • 2023-01-27
      • 1970-01-01
      • 2023-03-11
      • 2017-08-21
      相关资源
      最近更新 更多