在pandas dataframe

时间:2017-04-12 16:10:19

标签: python pandas

我有一个如下所示的数据框

| FName | F1 |  F2 | F3| 
| A     | 0  |  1  | 1 |
| B     | 1  |  0  | 1 |
| C     | 1  |  0  | 0 |
| D     | 1  |  1  | 1 |

从这里我需要找到每列的成对设置交集的计数,即F1-F2为1,F1-F3为2,F2-F3为2,依此类推。

一种显而易见的方法是将每个系列转换为set数据结构,然后采用集合交集,后跟结果集的长度。但是大熊猫有没有办法实现同样的目标呢?

2 个答案:

答案 0 :(得分:3)

您可以将luac设置为索引,然后使用矩阵乘法(假设此处只有1和0,并且您想要计算两个1的重叠):

FName

enter image description here

答案 1 :(得分:2)

numpy

使用bool广播
d1 = df.set_index('FName')
v = d1.values.astype(bool)
pd.DataFrame(
    (v.reshape(4, 1, 3) & v.reshape(4, 3, 1)).sum(0),
    d1.columns, d1.columns
)

    F1  F2  F3
F1   3   1   2
F2   1   2   2
F3   2   2   3

或使用np.einsum执行点积

d1 = df.set_index('FName')
v = d1.values

pd.DataFrame(
    np.einsum('ij,jk->ik', v.T, v),
    d1.columns, d1.columns
)


    F1  F2  F3
F1   3   1   2
F2   1   2   2
F3   2   2   3

np.dot

等效
d1 = df.set_index('FName')
v = d1.values

# python 3 should be able to do `v.T @ v`
pd.DataFrame(
    v.T.dot(v),
    d1.columns, d1.columns
)

时间测试

enter image description here