首页 > 解决方案 > 来自多个是或否数据框列的汇总矩阵

问题描述

我有一个数据框,其中多列显示是或否(1 或 0)值。我需要为每一个列准备一个矩阵(类似于 seaborn 下的 pairplot - 但我需要一个矩阵而不是图)。

     A    B    C    D    E    F    G
0    1    1    0    0    1    0    1
1    1    0    1    0    1    1    0
2    0    1    0    0    1    1    1
and so on...

我通过使用以下每个组合从过滤的数据框中获取值的计数来手动完成此操作: AvsB = df[(df['A'] == 1) & (df['B'] == 1)].count()

然后我通过从这些变量创建一个列表来手动使用所有这些值创建一个矩阵数据框。

但是,我正在寻找一个捷径来做到这一点。

我可以为此使用的任何功能或方法?

感谢帮助。

编辑:预期输出:

      A   B   C   D...
A    ...  ...
B    ...
C
D
...

标签: pythonpandasdataframematrixfilter

解决方案


您可以创建 DataFrame 列表或创建一个 DataFrame。一种方法是itertools.combinations+ DataFrame.groupby。在第一种情况下,您可以使用.to_numpy()来获取矩阵。

from itertools import combinations

l = [df[[*comb]].groupby([*comb]).size().unstack(fill_value=0)
     for comb in combinations(df, 2)]

print(l[0])

B  0  1
A      
0  0  1
1  1  1

new_df = pd.DataFrame({comb : df[[*comb]].groupby([*comb]).size() 
                       for comb in combinations(df, 2)}).fillna(0)
print(new_df)

       A                             B                 ...    C            \
       B    C    D    E    F    G    C    D    E    F  ...    D    E    F   
0 0  0.0  1.0  1.0  0.0  0.0  0.0  0.0  1.0  0.0  0.0  ...  2.0  0.0  1.0   
  1  1.0  0.0  0.0  1.0  1.0  1.0  1.0  0.0  1.0  1.0  ...  0.0  2.0  1.0   
1 0  1.0  1.0  2.0  0.0  1.0  1.0  2.0  2.0  0.0  1.0  ...  1.0  0.0  0.0   
  1  1.0  1.0  0.0  2.0  1.0  1.0  0.0  0.0  2.0  1.0  ...  0.0  1.0  1.0   

            D              E         F  
       G    E    F    G    F    G    G  
0 0  0.0  0.0  1.0  1.0  0.0  0.0  0.0  
  1  2.0  3.0  2.0  2.0  0.0  0.0  1.0  
1 0  1.0  0.0  0.0  0.0  1.0  1.0  1.0  
  1  0.0  0.0  0.0  0.0  2.0  2.0  1.0 

我们可以看到size每个组合 (0, 1)、(1, 0) 等的 A、B。

细节

list(combinations(df, 2))

[('A', 'B'),
 ('A', 'C'),
 ('A', 'D'),
 ('A', 'E'),
 ('A', 'F'),
 ('A', 'G'),
 ('B', 'C'),
 ('B', 'D'),
 ('B', 'E'),
 ('B', 'F'),
 ('B', 'G'),
 ('C', 'D'),
 ('C', 'E'),
 ('C', 'F'),
 ('C', 'G'),
 ('D', 'E'),
 ('D', 'F'),
 ('D', 'G'),
 ('E', 'F'),
 ('E', 'G'),
 ('F', 'G')]

优雅的外观

from itertools import permutations


new_df = pd.DataFrame({comb : df[[*comb]].groupby([*comb]).size() 
                       for comb in permutations(df, 2)})\
    .stack(dropna=False).unstack(level=0).fillna(0).swaplevel().sort_index()
print(new_df)

       A         B         C         D         E         F         G     
       0    1    0    1    0    1    0    1    0    1    0    1    0    1
A 0  0.0  0.0  0.0  1.0  1.0  0.0  1.0  0.0  0.0  1.0  0.0  1.0  0.0  1.0
  1  0.0  0.0  1.0  1.0  1.0  1.0  2.0  0.0  0.0  2.0  1.0  1.0  1.0  1.0
B 0  0.0  1.0  0.0  0.0  0.0  1.0  1.0  0.0  0.0  1.0  0.0  1.0  1.0  0.0
  1  1.0  1.0  0.0  0.0  2.0  0.0  2.0  0.0  0.0  2.0  1.0  1.0  0.0  2.0
C 0  1.0  1.0  0.0  2.0  0.0  0.0  2.0  0.0  0.0  2.0  1.0  1.0  0.0  2.0
  1  0.0  1.0  1.0  0.0  0.0  0.0  1.0  0.0  0.0  1.0  0.0  1.0  1.0  0.0
D 0  1.0  2.0  1.0  2.0  2.0  1.0  0.0  0.0  0.0  3.0  1.0  2.0  1.0  2.0
  1  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
E 0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
  1  1.0  2.0  1.0  2.0  2.0  1.0  3.0  0.0  0.0  0.0  1.0  2.0  1.0  2.0
F 0  0.0  1.0  0.0  1.0  1.0  0.0  1.0  0.0  0.0  1.0  0.0  0.0  0.0  1.0
  1  1.0  1.0  1.0  1.0  1.0  1.0  2.0  0.0  0.0  2.0  0.0  0.0  1.0  1.0
G 0  0.0  1.0  1.0  0.0  0.0  1.0  1.0  0.0  0.0  1.0  0.0  1.0  0.0  0.0
  1  1.0  1.0  0.0  2.0  2.0  0.0  2.0  0.0  0.0  2.0  1.0  1.0  0.0  0.0

推荐阅读