2016-10-21 3 views
3

betrachten die pd.DataFramedfDatenrahmendiagonalen in Spalten ausrichten?

df = pd.DataFrame([ 
     [1, 2, 3, 4, 5], 
     [5, 1, 2, 3, 4], 
     [4, 5, 1, 2, 3], 
     [3, 4, 5, 1, 2], 
     [2, 3, 4, 5, 1] 
    ], list('abcde'), list('ABCDE')) 

Wie kann ich die Diagonalwerte in Spalten ausrichten?

Ich würde dies als dieses

pd.DataFrame([np.roll(row, -k) for k, (_, row) in enumerate(df.iterrows())], 
      df.index, df.columns) 

getan Ich habe

enter image description here


Ergebnis möchte ich für mehr gerade nach vorne etwas Hoffnung, bin.

+3

pandas.Index.diagonal – kpie

Antwort

4

Sie können solution verwenden numpy - für Verschiebung verwendet wird, umgekehrt Series gleiche Länge wie DataFrame (wenn DataFrame nicht numerischen und nicht monotonen Index hat es funktioniert auch schön):

A = df.values 
r = pd.Series(range(len(df)))[::-1] + 1 

rows, column_indices = np.ogrid[:A.shape[0], :A.shape[1]] 

r[r < 0] += A.shape[1] 
column_indices = column_indices - r[:,np.newaxis] 

result = A[rows, column_indices] 
print (pd.DataFrame(result, df.index, df.columns)) 
    A B C D E 
a 1 2 3 4 5 
b 1 2 3 4 5 
c 1 2 3 4 5 
d 1 2 3 4 5 
e 1 2 3 4 5 
2

Hier ist ein weiterer Ansatz ist mit NumPy broadcasting -

a = df.values 
n = a.shape[1] 
r = np.arange(n) 
col = np.mod(r[:,None] + r,n) 
df_out = pd.DataFrame(a[np.arange(n)[:,None],col],columns=df.columns) 
Verwandte Themen