在python中将具有不同列数的数据帧连接起来后,如何不让列按字母顺序排序

时间:2018-07-17 02:24:51

标签: python dataframe concatenation alphabetical columnsorting

当使用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]

2 个答案:

答案 0 :(得分:1)

使用sort=Falsereference

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

有效。