2017-10-26 4 views
2

Schnelle Frage, dass ich für die beste Umsetzung brainst. Ich erzeuge eine Matrix, um zu addieren, wie oft zwei Elemente nebeneinander in einer Liste über eine große Anzahl von Permutationen dieser Liste gefunden werden. Mein Code sieht in etwa wie folgt aus:Fügen Sie Werte für übereinstimmende Spalten- und Zeilennamen hinzu

agreement_matrix = pandas.DataFrame(0, index=names, columns=names) 
for list in bunch_of_lists: 
    for i in range(len(list)-1): 
     agreement_matrix[list[i]][list[i+1]] += 1 

Es erzeugt ein Array wie:

A B C D 
A 0 2 1 1 
B 2 0 1 1 
C 1 1 0 2 
D 1 1 2 0 

Und weil ich nicht über Auftrag egal wie viel ich will Werte addieren, so es so ist:

A B C D 
A 0 4 2 2 
B 0 0 2 2 
C 0 0 0 4 
D 0 0 0 0 

Gibt es eine schnelle/einfache Möglichkeit, dies zu erreichen? Ich habe mit beiden herumgespielt, sowohl nach der Generation als auch nach dem Versuch, es zu tun, während ich Werte hinzufügte.

+0

@ cᴏʟᴅsᴘᴇᴇᴅ denke ich Ihre Antwort ist gut. –

+0

@AndyHayden Danke. Nur nicht sicher wegen OP und ihrer "erwarteten Ausgabe". :-( –

+0

@OP Etwas über Ihre erwartete Ausgabe scheint falsch. Können Sie bitte bestätigen? Sollte nicht AD 2 sein? BD Ich würde mir vorstellen, dass auch 2 sein sollte. –

Antwort

3

Verwendung np.tri*:

np.triu(df) + np.tril(df).T 

array([[0, 4, 2, 2], 
     [0, 0, 2, 2], 
     [0, 0, 0, 4], 
     [0, 0, 0, 0]]) 

Rufen Sie den DataFrame Konstruktor:

pd.DataFrame(np.triu(df) + np.tril(df).T, df.index, df.columns) 

    A B C D 
A 0 4 2 2 
B 0 0 2 2 
C 0 0 0 4 
D 0 0 0 0 
+0

Genau das habe ich gesucht. Danke für die schnelle und einfache Lösung. Ich sollte für zukünftige Zuschauer bemerken, dass, obwohl mein bereitgestelltes Beispiel um die Diagonale symmetrisch war, dies in Fällen zu funktionieren scheint, in denen es nicht so gut ist. – Brendan

+0

Nette Verwendung von 'triu' und' tril' :-) – Wen

1

A Pandas Lösung die erste Schleife zu vermeiden:

values=['ABCD'[i] for i in np.random.randint(0,4,100)] # data 

df=pd.DataFrame(values) 
df[1]=df[0].shift() 
df=df.iloc[1:] 
df.values.sort(axis=1) 
df[2]=1 

res=df.pivot_table(2,0,1,np.sum,0) 
# 
#1 A B C D 
#0    
#A 2 14 11 16 
#B 0 5 9 13 
#C 0 0 10 17 
#D 0 0 0 2 
1

das Problem zu lösen ..

np.triu(df.values*2)#df.values.T+df.values 
Out[595]: 
array([[0, 4, 2, 2], 
     [0, 0, 2, 2], 
     [0, 0, 0, 4], 
     [0, 0, 0, 0]], dtype=int64) 

Dann tun Sie

pd.DataFrame(np.triu(df.values*2), df.index, df.columns) 
Out[600]: 
    A B C D 
A 0 4 2 2 
B 0 0 2 2 
C 0 0 0 4 
D 0 0 0 0 
+0

@ cᴏʟᴅsᴘᴇᴇᴅ wie auch immer, ich upvotiert ... :-) – Wen

+0

Ja, ich gab dir meine letzte Stimme lol. –

+0

Dies scheint nur für Werte zu funktionieren, die um die Diagonale symmetrisch sind, es sei denn, ich bin falsch. – Brendan

Verwandte Themen