我有以下形式的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)
熊猫可以输出吗?
我们可以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)
使用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)
| 归档时间: |
|
| 查看次数: |
207 次 |
| 最近记录: |