我有一个包含400列和100行的pandas DataFrame,我希望将其显示为图像。生成这些数据的仪器以某种方式进行操作,要求每隔一行反转才能正确显示。
如果转换为2D np.array(即第1,3,5,7 ...... len(df)行,我如何反转pandas中的特定行或numpy?
答案 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