2017-04-12 190 views
1

在列的成对交叠我有一个数据帧如下所示查找在大熊猫数据帧

| 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数据结构,然后进行设置交集,然后进行结果集合的长度。但是熊猫有什么办法可以达到同样的效果呢?

回答

3

您可以设置FName为指标,然后用矩阵乘法(假设你只有1和0这里,你要算为1s的重叠):

df.set_index("FName", inplace=True) 
df.T.dot(df) 

enter image description here

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