gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:14:31 31 4
gpt4 key购买 nike

我在使用 python 作为双层 header 时遇到了这个问题。并从其他论坛发现了同样的问题,如下所述:

当连接 DataFrame 且标题为双层时,如果列名之间存在任何差异,则列名将按字母数字顺序排序。如果它们在 DataFrame 中相同,则不会进行排序。

这种类型没有记录并且不需要。当然,默认行为应该是不排序。例如:

我有两个数据框

# 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排序”,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 columns name in original order]

最佳答案

有趣的问题...但是,我认为我找到了解决多索引列数据帧连接时 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

不,这不起作用。

因此,让我们首先连接两个数据帧中的列索引。

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

成功了。

关于python - 在Python中连接具有不同列数的数据帧后,如何不让列按字母顺序排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51372389/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com