Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于列名反转dataframe的列_Python_Pandas_Dataframe - Fatal编程技术网

Python 基于列名反转dataframe的列

Python 基于列名反转dataframe的列,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据帧: '1000' '0100' '0010' '0001' '1110' '1101' '1011' '0111' 0 0 1 2 3 4 5 6 7 1 00 11 22 33 44 55 66

我有一个数据帧:

     '1000'    '0100'    '0010'    '0001'    '1110'    '1101'    '1011'    '0111'
0        0         1         2         3         4         5         6         7
1       00        11        22        33        44        55        66        77
我想将其列名的1st2nd字母颠倒的列以及3rd4th原样颠倒

i、 e

第1列:1000→ 第二栏:0100

第三列:0010→ 第5列:1110

第四列:0001→ 第6列:1101

第7列:1011→ 第8列:0111

我想要一个这样的数据帧:

     '0100'    '1000'    '1110'    '1101'    '0010'    '0001'    '1011'    '0111'
0        1         0         4         5         2         3         7         6
1       11        00        44        55        22        33        77        66
这就是我对回归的看法:
reversed=''.join('1'如果x='0'或者'0'对于1stand2ndletter中的x)

在列表理解中使用函数,添加接下来的2个值,然后按子集中的原始顺序更改列的顺序:

df.columns = df.columns.str.strip("'")
cols = df.columns

df.columns = [''.join('1' if x == '0' else '0' for x in y[:2])+y[2:] for y in df.columns]

df = df[cols]
print (df)
   1000  0100  0010  0001  1110  1101  1011  0111
0     1     0     4     5     2     3     7     6
1    11     0    44    55    22    33    77    66
编辑:更通用的解决方案是将值转换为由布尔值填充的二维numpy数组:

df.columns = df.columns.str.strip("'")
cols = df.columns

arr = np.array([[bool(int(y)) for y in x] for x in df.columns])
print (arr)
[[ True False False False]
 [False  True False False]
 [False False  True False]
 [False False False  True]
 [ True  True  True False]
 [ True  True False  True]
 [ True False  True  True]
 [False  True  True  True]]
然后,对于反转使用索引,这里的
表示所有行和列位置表单列表和
~
反转掩码:

pos = [0, 2]
arr[:, pos] = ~arr[:, pos]
print (arr)
[[False False  True False]
 [ True  True  True False]
 [ True False False False]
 [ True False  True  True]
 [False  True False False]
 [False  True  True  True]
 [False False False  True]
 [ True  True False  True]]
最后一次连接回字符串列表:

df.columns = [''.join(str(int(y)) for y in x) for x in arr]
print (df)
   0010  1110  1000  1011  0100  0111  0001  1101
0     0     1     2     3     4     5     6     7
1     0    11    22    33    44    55    66    77

# df = df[cols]

我更喜欢使用df.rename,更“pythonic”:

如果要翻转1档和3档,类似地:

df = df.rename(columns = lambda x: x[2]+x[1]+x[0]+x[3])

非常感谢你!!!你知道如果我想把第一个和第三个倒过来,第二个和第四个倒过来会怎么样吗?@Δήμητραεωργγγγγγγγγ-给我一些时间@Δήμηητραεωωργγγγγ-答案被编辑了。@Δήμηηητττττταεγγγγγγγγγγγγγγ-然后在我的解决方案之后加上
df[cols]
,你说得对!我没有注意到!不客气!非常感谢你!这也行!
df = df.rename(columns = lambda x: x[2]+x[1]+x[0]+x[3])