python - 来自多个是或否数据框列的汇总矩阵
问题描述
我有一个数据框,其中多列显示是或否(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
...
解决方案
您可以创建 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
推荐阅读
- javascript - 如何返回没有类型的数组
- ios - 为什么我会得到“无法获取键控解码容器 - 而是找到了空值。” 使用 JSONDecoder 时出错
- react-native - React native:安装 react-native-maps 后不存在 android 文件夹
- c# - 提交表单后在 ASP.NET MVC 中。它没有重定向到其他页面。它加载相同的页面
- database - 在不同节点中作为容器运行的数据库映像的不同实例中如何同步数据?
- drupal - Drupal 7 - 找不到视图 xxx(使用服务模块)
- java - 无法在 Safari 13.0.4 中使用 Selenium 单击元素
- javascript - 混合(图像+视频)类型的灯箱问题
- vb.net - 在 aspx 页面中写入文件后删除空格
- python - 使用另一个列表中的关键字列表进行模式匹配,如果匹配则重新映射到后续类别,否则类别为空白