当使用python作为双层头时,我遇到了这个问题。并在其他论坛中发现与以下州相同的问题:
在连接DataFrame时,如果标头是双级的,则列名之间按字母数字顺序进行排序。如果它们在DataFrames中相同,则不会排序。
这种记录是无证的,不需要的。当然,默认行为应为不排序。例如:
我有两个数据框
# df1: C A B # df2: C A B D
1 2 3 1 2 3 4
0 4 5 6 0 5 6 7 8
1 7 8 9 1 9 10 11 12
如果我打印“ Cols sorted”,concat([df1,df2],sort = False)
# Cols sorted A B C D
2 3 1 4
0 5 6 4 NaN
1 8 9 7 NaN
但是我想将其保留为原始顺序,例如:
# Cols wanted: C A B D
1 2 3 4
0 4 5 6 NaN
1 7 8 9 NaN
因为将df1串联时放在首位。当我使用df1.append(df2)
时,我遇到了同样的问题。
我还要组织一个包含60多个列的DataFrame。因此,我可以按照正确的顺序创建一个新的列名列表,只需执行df = df[list of column name in original order]
答案 0 :(得分:1)
使用sort=False
(reference)
pd.concat([df4a,df5], sort=False)
C B D A E
0 -2.089701 -0.485516 1.610569 -1.048672 NaN
1 -0.675452 -0.367919 -1.610718 -1.624306 NaN
答案 1 :(得分:0)
有趣的问题...但是,我认为我在多索引列数据帧串联失败时发现了sort = False周围的问题。
让我们首先通过将数据帧列索引转换为数据帧并使用pd.concat来将它们索引在一起。然后,使用该结果的索引重新索引pd.concat数据帧的列轴,以恢复原始列顺序。
设置:
df = pd.DataFrame({'A':np.random.choice(list('ABC'),10) , 'B':np.random.randint(0,5,10),'C':np.random.random(10)})
df1 = df.set_index(['A','B'], append=True)['C'].unstack([1,2])
df = pd.DataFrame({'A':np.random.choice(list('DEF'),10) , 'B':np.random.randint(0,5,10),'C':np.random.random(10)})
df2 = df.set_index(['A','B'], append=True)['C'].unstack([1,2])
print(df1)
A B C B A C B
B 1 4 2 0 0 4 4 2
0 0.657680 NaN NaN NaN NaN NaN NaN NaN
1 0.518157 NaN NaN NaN NaN NaN NaN NaN
2 NaN 0.776922 NaN NaN NaN NaN NaN NaN
3 NaN NaN 0.063375 NaN NaN NaN NaN NaN
4 0.328447 NaN NaN NaN NaN NaN NaN NaN
5 NaN NaN NaN 0.598312 NaN NaN NaN NaN
6 NaN NaN NaN NaN 0.918801 NaN NaN NaN
7 NaN NaN NaN NaN NaN 0.045484 NaN NaN
8 NaN NaN NaN NaN NaN NaN 0.71723 NaN
9 NaN NaN NaN NaN NaN NaN NaN 0.246769
print(df2)
A D E D F E
B 1 0 0 3 2 3 2 4
0 0.396883 NaN NaN NaN NaN NaN NaN NaN
1 NaN 0.789478 NaN NaN NaN NaN NaN NaN
2 NaN NaN 0.076724 NaN NaN NaN NaN NaN
3 NaN NaN NaN 0.424836 NaN NaN NaN NaN
4 NaN NaN NaN NaN 0.970031 NaN NaN NaN
5 NaN NaN NaN NaN NaN 0.119261 NaN NaN
6 0.781708 NaN NaN NaN NaN NaN NaN NaN
7 NaN NaN NaN NaN NaN NaN 0.57147 NaN
8 NaN NaN NaN NaN NaN NaN NaN 0.407157
9 NaN NaN NaN NaN 0.932431 NaN NaN NaN
首先,让我们尝试pd.concat([df1,df2], sort=False)
,打印头(2):
A A B C D E F
B 0 4 0 1 2 4 2 4 0 1 2 3 0 4 2 3
0 NaN NaN NaN 0.657680 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN 0.518157 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
不,那没用。
因此,首先让concat列索引同时来自两个数据帧。
orig_cols = pd.concat([df1.columns.to_frame(), df2.columns.to_frame()]).index
pd.concat([df1,df2]).reindex(orig_cols, axis=1)
现在让我们看一下head(2)的输出:
A B C B A C B D E D F E
B 1 4 2 0 0 4 4 2 1 0 0 3 2 3 2 4
0 0.657680 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 0.518157 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
有效。