2016-05-17 63 views
0

我有一個有400列和100行的pandas DataFrame,我想將它們顯示爲圖像。產生這些數據的儀器確實需要每隔一行反轉一次以使其正確顯示。在numpy數組或熊貓中反向偶數據行DataFrame

我怎樣才能逆轉大熊貓或與numpy的特定行,如果變換爲2D np.array(即行1,3,5,7 ... LEN(DF)?

回答

3

設置
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 

解釋

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

示範
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 

創建一個您想要反轉的行爲True的掩碼(例如, Even = False,Odd = True),使用loc找到這些行並反轉它們的值(::-1是在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

如果您的應用程序主要是圖像處理,熊貓DataFrame可能是矯枉過正。下面是一個反轉numpy數組的其他行的方法的示例。它在原地經營:

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

太棒了,謝謝。運作良好! – GregW