在numpy数组或pandas DataFrame中反转偶数行

时间:2016-05-17 15:38:59

标签: python pandas numpy dataframe

我有一个包含400列和100行的pandas DataFrame,我希望将其显示为图像。生成这些数据的仪器以某种方式进行操作,要求每隔一行反转才能正确显示。

如果转换为2D np.array(即第1,3,5,7 ...... len(df)行,我如何反转pandas中的特定行或numpy?

3 个答案:

答案 0 :(得分:4)

设置

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 :(得分:4)

如果你的应用程序主要是图像处理,那么pandas 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]])

答案 2 :(得分: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