计算大熊猫同时发生的更好方法

时间:2019-07-11 22:18:25

标签: python pandas

我有一个带有布尔列的数据框,每个布尔列指示记录是否属于类别:

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

这给了我正确的输出,但是我想知道是否有人认为他们找到了解决该问题的更好的方法。

3 个答案:

答案 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