2017-04-12 191 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