3 votes

Aligner les diagonales du dataframe en colonnes ?

Considérer le pd.DataFrame df

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

Comment aligner les valeurs diagonales en colonnes ?

J'aimerais que le résultat soit le suivant

enter image description here


Je l'ai fait.

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

J'espère quelque chose de plus direct.

4voto

jezrael Points 290608

Vous pouvez utiliser numpy solution - pour le décalage est utilisé inversé Series la même longueur que DataFrame (si DataFrame a un indice non numérique et non monotone, cela fonctionne bien aussi) :

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

2voto

Divakar Points 20144

Voici une autre approche utilisant 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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X