2016-05-17 12 views
0

Ich habe ein Pandas DataFrame mit 400 Spalten und 100 Zeilen, die ich als Bild anzeigen möchte. Das Instrument, das diese Daten erzeugt, tut dies so, dass jede zweite Zeile umgekehrt werden muss, damit sie korrekt angezeigt wird.Umgekehrte gerade Zeilen in einem numply Array oder Pandas DataFrame

Wie kann ich umkehren bestimmte Zeilen in Pandas oder mit numpy zu einer 2D-np.array umgewandelt, wenn (dh Zeile 1, 3, 5, 7 ... len (df)?

Antwort

3

Setup-

import pandas as pd 

df = pd.DataFrame([range(5) for _ in range(10)], 
        index=list('abcdefghij'), 
        columns=list('abcde')) 

print df 

    a b c d e 
a 0 1 2 3 4 
b 0 1 2 3 4 
c 0 1 2 3 4 
d 0 1 2 3 4 
e 0 1 2 3 4 
f 0 1 2 3 4 
g 0 1 2 3 4 
h 0 1 2 3 4 
i 0 1 2 3 4 
j 0 1 2 3 4 

Lösung und Erklärung

df.iloc[1::2, :] = df.iloc[1::2, ::-1].values 
#  ^^      ^ 
#  | |     Reverse 
# Start | 
# Every other row 

Demonstration

print df 

    a b c d e 
a 0 1 2 3 4 
b 4 3 2 1 0 
c 0 1 2 3 4 
d 4 3 2 1 0 
e 0 1 2 3 4 
f 4 3 2 1 0 
g 0 1 2 3 4 
h 4 3 2 1 0 
i 0 1 2 3 4 
j 4 3 2 1 0 
1
df = pd.DataFrame([range(4)], columns=list('ABCD'), index=range(5)) 

>>> df 
    A B C D 
0 0 1 2 3 
1 0 1 2 3 
2 0 1 2 3 
3 0 1 2 3 
4 0 1 2 3 

Erstellen Sie eine Maske, in der die Zeilen, die Sie umkehren möchten, True sind (z. Even = False, Odd = True), verwenden Sie loc, um diese Zeilen zu suchen und ihre Werte umzukehren (::-1 ist eine gängige Methode zum Umkehren einer Liste in Python).

mask = [i % 2 == 1 for i in range(len(df))] 
df.loc[mask] = df.loc[mask, ::-1].values 

>>> df 
    A B C D 
0 0 1 2 3 
1 3 2 1 0 
2 0 1 2 3 
3 3 2 1 0 
4 0 1 2 3 
3

Wenn Ihre Anwendung hauptsächlich Bildverarbeitung ist, ist ein Pandas DataFrame wahrscheinlich übertrieben. Hier ist ein Beispiel für eine Möglichkeit, jede zweite Zeile eines numpligen Arrays umzukehren. Es funktioniert in-Place:

In [656]: a 
Out[656]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11], 
     [12, 13, 14, 15], 
     [16, 17, 18, 19], 
     [20, 21, 22, 23]]) 

In [657]: a[1::2, :] = a[1::2, ::-1] 

In [658]: a 
Out[658]: 
array([[ 0, 1, 2, 3], 
     [ 7, 6, 5, 4], 
     [ 8, 9, 10, 11], 
     [15, 14, 13, 12], 
     [16, 17, 18, 19], 
     [23, 22, 21, 20]]) 
+0

Fantastisch, danke. gut gearbeitet! – GregW

Verwandte Themen