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
,而不仅仅是成对
将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)