2016-07-18 163 views
5

ho un PandasDataFrame che assomiglia a questo:elementi comuni tra le colonne di un dataframe

MemberID A B C D 
1   0.3 0.5 0.1 0 
2   0 0.2 0.9 0.3 
3   0.4 0.2 0.5 0.3 
4   0.1 0 0  0.7 

Vorrei avere un'altra matrice, che mi dà il numero di elementi diversi da zero per l'intersezione di ogni colonna ad eccezione di MemberID.

Ad esempio, l'intersezione delle colonne A e B sarebbe 2 (perché MemberID 1 e 3 hanno valori diversi da zero per A e B), intersezione di A e C sarebbe 2 così (perché MemberID 1 e 3 avere valori diversi da zero per A e C).

La matrice finale sarebbe così:

A B C D 
A 3 2 2 2 
B 2 3 3 2 
C 2 3 3 2 
D 2 2 2 3 

Come possiamo vedere, dovrebbe essere una matrice simmetrica, simile a una matrice di correlazione, ma non la matrice di correlazione.

Intersezione di 2 colonne = numero di MemberID con valori diversi da zero in entrambe le colonne.

Mostrerei qui un codice iniziale, ma mi sembra che ci sarebbe una semplice funzione per eseguire questo compito che non conosco.

Ecco il codice per creare il DataFrame:

df = pd.DataFrame([[0.3, 0.5, 0.1, 0], 
        [0, 0.2, 0.9, 0.3], 
        [ 0.4, 0.2, 0.5, 0.3], 
        [ 0.1, 0, 0, 0.7]], 
        columns=list('ABCD')) 

Qualsiasi puntatori sarebbe apprezzato. TIA.

+0

'df.A' ha un elemento che è pari a zero. non dovrebbe 'final.loc ['A', 'A'] == 3' – piRSquared

risposta

4

Questo dovrebbe ad esso:

z = (df != 0) * 1 
z.T.dot(z) 

enter image description here

+0

Lo ha fatto, grazie mille :) – Patthebug