2016-05-17 39 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