pandas.concat中的列顺序

Edw*_*ard 20 python concat pandas

我这样做:

data1 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
data2 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
frames = [data1, data2]
data = pd.concat(frames)
data


   a    b
0   2   1
1   2   1
2   2   1
0   2   1
1   2   1
2   2   1
Run Code Online (Sandbox Code Playgroud)

数据列顺序按字母顺序排列.为什么会这样?以及如何保持原始订单?

alb*_*ert 13

您正在使用词典创建DataFrame.字典是无序的,这意味着密钥没有特定的顺序.所以

d1 = {'key_a': 'val_a', 'key_b': 'val_b'}
Run Code Online (Sandbox Code Playgroud)

d2 = {'key_b': 'val_b', 'key_a': 'val_a'}
Run Code Online (Sandbox Code Playgroud)

是相同的.

除此之外,我假设pandas默认对字典的键进行排序(不幸的是我没有在文档中找到任何提示来证明这个假设)导致你遇到的行为.

因此,基本动机是对DataFrame中的列进行求助/重新排序.你可以这样做如下:

import pandas as pd

data1 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
data2 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
frames = [data1, data2]
data = pd.concat(frames)

print(data)

cols = ['b' , 'a']
data = data[cols]

print(data)
Run Code Online (Sandbox Code Playgroud)


Mic*_* H. 9

从 0.23.0 版本开始,您可以阻止 concat() 方法对返回的 DataFrame 进行排序。例如:

df1 = pd.DataFrame({ 'a' : [1, 1, 1], 'b' : [2, 2, 2]})
df2 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
df = pd.concat([df1, df2], sort=False)
Run Code Online (Sandbox Code Playgroud)

未来版本的 Pandas 将更改为默认不排序。


小智 5

def concat_ordered_columns(frames):
    columns_ordered = []
    for frame in frames:
        columns_ordered.extend(x for x in frame.columns if x not in columns_ordered)
    final_df = pd.concat(frames)    
    return final_df[columns_ordered]       

# Usage
dfs = [df_a,df_b,df_c]
full_df = concat_ordered_columns(dfs)
Run Code Online (Sandbox Code Playgroud)

这应该有效。