我有一个带有布尔列的数据框,每个布尔列指示记录是否属于类别:
import pandas as pd
example = pd.DataFrame({
"is_a": [True, False, True, True],
"is_b": [False, False, False, True],
"is_c": [True, False, False, True],
})
示例:
is_a is_b is_c
0 True False True
1 False False False
2 True False False
3 True True True
我想计算每对类别之间同时出现的次数。我目前正在这样做:
cols = ["is_a", "is_b", "is_c"]
output = pd.DataFrame(
{x: [(example[x] & example[y]).sum() for y in cols] for x in cols},
index=cols,
)
输出:
is_a is_b is_c
is_a 3 1 2
is_b 1 1 1
is_c 2 1 2
这给了我正确的输出,但是我想知道是否有人认为他们找到了解决该问题的更好的方法。
答案 0 :(得分:5)
dot
这是使用pandas.DataFrame.dot
运算符的Pandas方法@
方法。
(lambda d: d.T @ d)(example.astype(int))
is_a is_b is_c
is_a 3 1 2
is_b 1 1 1
is_c 2 1 2
相同,但改用ndarray
a = example.to_numpy().astype(int)
pd.DataFrame(a.T @ a, example.columns, example.columns)
is_a is_b is_c
is_a 3 1 2
is_b 1 1 1
is_c 2 1 2
答案 1 :(得分:1)
我们可以使用矩阵乘法来解决这个问题。
import numpy as np
import pandas as pd
example = pd.DataFrame({
"is_a": [True, False, True, True],
"is_b": [False, False, False, True],
"is_c": [True, False, False, True],
})
encoded_example = example.astype(int)
output = pd.DataFrame(
np.dot(encoded_example.T, encoded_example),
index=encoded_example.columns,
columns=encoded_example.columns
)
答案 2 :(得分:1)
我将使用numpy
广播
s=example.values.T
np.sum(s&s[:,None],2)
array([[3, 1, 2],
[1, 1, 1],
[2, 1, 2]])
转换为数据框
pd.DataFrame(np.sum(s&s[:,None],2),columns=example.columns,index=example.columns)
is_a is_b is_c
is_a 3 1 2
is_b 1 1 1
is_c 2 1 2