在 Pandas 数据框中创建一个包含布尔列组合计数的方阵
Create a square matrix with combinatorial counts of boolean columns in a Pandas dataframe
我有一个 Pandas 数据框,其中包含许多长列的布尔值。
Col1 Col2 Col3
0 False True True
1 False True True
2 False True True
3 False True False
4 True False True
我可以在每个成对的列组合上使用 GroupBy 来获取计数,但我希望有一种更优雅的方法来对列进行成对比较并将结果放入 table (correlation/coincidence矩阵)以便于理解。明确地说,如果相关的两列都为真,我想计算条件。我不太关心身份条目(即 Col1 与自身),但在我的示例中,我刚刚对该列的 True 条件进行了计数。
Col1 Col2 Col3
Col1 1 0 1
Col2 0 4 3
Col3 1 3 4
您可以使用 numpy
。使用逻辑 and (&
) as 运算符将数组与自身进行比较:
a = df.values
(a.T[:, None]&a.T).sum(axis=2)
输出:
array([[1, 0, 1],
[0, 4, 3],
[1, 3, 4]])
作为数据框:
pd.DataFrame((a.T[:, None]&a.T).sum(2),
columns=df.columns,
index=df.columns)
输出:
Col1 Col2 Col3
Col1 1 0 1
Col2 0 4 3
Col3 1 3 4
答案细分:
>>> a.T
array([[False, False, False, False, True],
[ True, True, True, True, False],
[ True, True, True, False, True]])
>>> a.T[:, None] ## note the extra dimension
array([[[False, False, False, False, True]],
[[ True, True, True, True, False]],
[[ True, True, True, False, True]]])
>>> (a.T[:, None]&a.T)
array([[[False, False, False, False, True],
[False, False, False, False, False],
[False, False, False, False, True]],
[[False, False, False, False, False],
[ True, True, True, True, False],
[ True, True, True, False, False]],
[[False, False, False, False, True],
[ True, True, True, False, False],
[ True, True, True, False, True]]])
>>> (a.T[:, None]&a.T).sum(2) ## counts the True in the third dimension
array([[1, 0, 1],
[0, 4, 3],
[1, 3, 4]])
我有一个 Pandas 数据框,其中包含许多长列的布尔值。
Col1 Col2 Col3
0 False True True
1 False True True
2 False True True
3 False True False
4 True False True
我可以在每个成对的列组合上使用 GroupBy 来获取计数,但我希望有一种更优雅的方法来对列进行成对比较并将结果放入 table (correlation/coincidence矩阵)以便于理解。明确地说,如果相关的两列都为真,我想计算条件。我不太关心身份条目(即 Col1 与自身),但在我的示例中,我刚刚对该列的 True 条件进行了计数。
Col1 Col2 Col3
Col1 1 0 1
Col2 0 4 3
Col3 1 3 4
您可以使用 numpy
。使用逻辑 and (&
) as 运算符将数组与自身进行比较:
a = df.values
(a.T[:, None]&a.T).sum(axis=2)
输出:
array([[1, 0, 1],
[0, 4, 3],
[1, 3, 4]])
作为数据框:
pd.DataFrame((a.T[:, None]&a.T).sum(2),
columns=df.columns,
index=df.columns)
输出:
Col1 Col2 Col3
Col1 1 0 1
Col2 0 4 3
Col3 1 3 4
答案细分:
>>> a.T
array([[False, False, False, False, True],
[ True, True, True, True, False],
[ True, True, True, False, True]])
>>> a.T[:, None] ## note the extra dimension
array([[[False, False, False, False, True]],
[[ True, True, True, True, False]],
[[ True, True, True, False, True]]])
>>> (a.T[:, None]&a.T)
array([[[False, False, False, False, True],
[False, False, False, False, False],
[False, False, False, False, True]],
[[False, False, False, False, False],
[ True, True, True, True, False],
[ True, True, True, False, False]],
[[False, False, False, False, True],
[ True, True, True, False, False],
[ True, True, True, False, True]]])
>>> (a.T[:, None]&a.T).sum(2) ## counts the True in the third dimension
array([[1, 0, 1],
[0, 4, 3],
[1, 3, 4]])