数据框列之间所有可能组合的计数

Dan*_*Dan 2 python numpy python-itertools python-3.x pandas

我正在尝试获取数据帧八列之间每个可能组合的计数(所有行值为1)。基本上,我需要了解不同重叠存在多少次。

我试图用它itertools.product来获得所有组合,但似乎不起作用。

import pandas as pd
import numpy as np
import itertools

df = pd.read_excel('filename.xlsx')

df.head(15)

    a   b   c   d   e   f   g   h
0   1   0   0   0   0   1   0   0
1   1   0   0   0   0   0   0   0
2   1   0   1   1   1   1   1   1
3   1   0   1   1   0   1   1   1
4   1   0   0   0   0   0   0   0
5   0   1   0   0   1   1   1   1
6   1   1   0   0   1   1   1   1
7   1   1   1   1   1   1   1   1
8   1   1   0   0   1   1   0   0
9   1   1   1   0   1   0   1   0
10  1   1   1   0   1   1   0   0
11  1   0   0   0   0   1   0   0
12  1   1   1   1   1   1   1   1
13  1   1   1   1   1   1   1   1
14  0   1   1   1   1   1   1   0


print(list(itertools.product(new_df.columns)))

Run Code Online (Sandbox Code Playgroud)

预期的输出将是一个数据帧,其中包含每个有效组合的行数(n)(其中行中的值均为1)。

例如:

    a   b
0   1   0   
1   1   0   
2   1   0   
3   1   0   
4   1   0   
5   0   1   
6   1   1   
7   1   1   
8   1   1   
9   1   1   
10  1   1   
11  1   0   
12  1   1   
13  1   1   
14  0   1
Run Code Online (Sandbox Code Playgroud)

会给

combination   count

a              12
a_b             7
b               9
Run Code Online (Sandbox Code Playgroud)

请注意,输出将需要包含a和之间的所有可能组合h,而不仅仅是成对

cs9*_*s95 5

动力组组合

powerset食谱与

s = pd.Series({
    '_'.join(c): df[c].min(axis=1).sum() 
    for c in map(list, filter(None, powerset(df)))
})

a                  13
b                   9
c                   8
d                   6
e                  10
f                  12
g                   9
h                   7
a_b                 7
...
Run Code Online (Sandbox Code Playgroud)

成对组合

这是特例,可以向量化。

from itertools import combinations

u = df.T.dot(df)   
pd.DataFrame({
    'combination': [*map('_'.join, combinations(df, 2))], 
    # pandas < 0.24
    # 'count': u.values[np.triu_indices_from(u, k=1)]
    # pandas >= 0.24
    'count': u.to_numpy()[np.triu_indices_from(u, k=1)]
})
Run Code Online (Sandbox Code Playgroud)

您可以使用dot,然后提取上三角矩阵值:

  combination  count
0         a_b      7
1         a_c      7
2         a_d      5
3         a_e      8
4         a_f     10
5         a_g      7
6         a_h      6
7         b_c      6
8         b_d      4
9         b_e      9
Run Code Online (Sandbox Code Playgroud)

  • 没想到您会使用`.min`。好东西 (2认同)