首页 > 解决方案 > Pandas 按两列分组并在第三列中计算共享值

问题描述

在 Pandas 中,我想按两列分组并计算共享了多少第三列值。随着对更大共享的偏好的增加。

在下面的数据框中,将 col1 值分组,将 col2 值分组并计算 col3 值与 col2 值共享的频率。

结果是:ID1 和 ID2 共享一个 col3 值 (2)。ID3 与无共享 (1)。但是,ID1、ID2 和 ID4 也共享一个值 (3)。由于 ID1 和 ID2 已经共享一个值,因此采用两个 ID 共享的值和更多 (3)。因此答案是 3,1。计数列表必须始终 = nunique col2 值。

col1 col2 col3
一种 ID1 15
一种 ID1 16
一种 ID1 12
一种 ID2 15
一种 ID2 12
一种 ID3 18
一种 ID4 19
一种 ID4 12

标签: pythonpandasnumpy

解决方案


如果我对您的理解正确,我认为您想分组col3而不是col2

df = pd.read_html('https://stackoverflow.com/q/69419264/14277722')[0]

df = df.groupby(['col1','col3'])['col2'].apply(list).reset_index()
df['count'] = df['col2'].apply(len)

然后,您可以使用以下内容删除col2另一行的子集的行:

arr = pd.get_dummies(df['col2'].explode()).max(level=0).to_numpy()
subsets = np.matmul(arr, arr.T)
np.fill_diagonal(subsets, 0)
mask = ~np.equal(subsets, np.sum(arr, 1)).any(0)

df = df[mask]
   col1 col3             col2  count
0     A   12  [ID1, ID2, ID4]      3
3     A   18            [ID3]      1     

推荐阅读