2016-10-21 10 views
3

は、私は列に対角値を揃えるにはどうすればよいpd.DataFramedfデータフレームの対角線を列に整列させますか?

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')) 

を検討しますか?

は、私はまっすぐ進むより多くの何かを望んでいる。この

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

をやった結果

enter image description here


としてこれをしたいと思います。

+3

pandas.Index.diagonal – kpie

答えて

4

あなたがnumpyのsolutionを使用することができます - シフトのためには使用されている(DataFrameが非数値および非単調なインデックスを持っている場合、それはまた素敵な作品)DataFrameSeries同じ長さを逆転さ:

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

ここ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) 
関連する問題