计算数据框列中最常见的值组合

Ale*_*x T 9 python pandas

我有以下形式的DataFrame:

ID Product
1   A
1   B
2   A 
3   A
3   C 
3   D 
4   A
4   B
Run Code Online (Sandbox Code Playgroud)

我想计算Product按分组的列中两个值的最常见组合ID。因此,对于此示例,预期结果将是:

Combination Count
A-B          2
A-C          1
A-D          1
C-D          1
Run Code Online (Sandbox Code Playgroud)

熊猫可以输出吗?

ALo*_*llz 5

我们可以merge在ID内过滤掉重复的合并(我假设您有一个默认值RangeIndex)。然后我们进行排序,以使分组与顺序无关:

import pandas as pd
import numpy as np

df1 = df.reset_index()
df1 = df1.merge(df1, on='ID').query('index_x > index_y')

df1 = pd.DataFrame(np.sort(df1[['Product_x', 'Product_y']].to_numpy(), axis=1))
df1.groupby([*df1]).size()
Run Code Online (Sandbox Code Playgroud)
0  1
A  B    2
   C    1
   D    1
C  D    1
dtype: int64
Run Code Online (Sandbox Code Playgroud)


And*_* L. 4

使用itertools.combinations,explode和value_counts

import itertools

(df.groupby('ID').Product.agg(lambda x: list(itertools.combinations(x,2)))
                 .explode().str.join('-').value_counts())

Out[611]:
A-B    2
C-D    1
A-D    1
A-C    1
Name: Product, dtype: int64
Run Code Online (Sandbox Code Playgroud)

或者:

import itertools

(df.groupby('ID').Product.agg(lambda x: list(map('-'.join, itertools.combinations(x,2))))
                 .explode().value_counts())

Out[597]:
A-B    2
C-D    1
A-D    1
A-C    1
Name: Product, dtype: int64
Run Code Online (Sandbox Code Playgroud)