Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.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 pandas.concat中的列顺序_Python_Pandas_Concat - Fatal编程技术网

Python pandas.concat中的列顺序

Python pandas.concat中的列顺序,python,pandas,concat,Python,Pandas,Concat,本人谨此陈辞: 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

本人谨此陈辞:

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
数据列顺序为字母顺序。为什么会这样?
如何保持原始顺序?

您正在使用字典创建数据帧。字典是无序的,这意味着键没有特定的顺序。所以

d1 = {'key_a': 'val_a', 'key_b': 'val_b'}

(可能)是一样的

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

因此,基本的动机是对数据帧中的列进行求助/重新排序。您可以这样做:


您可以使用OrderedPicts创建原始数据帧

from collections import OrderedDict

odict = OrderedDict()
odict['b'] = [1, 1, 1]
odict['a'] = [2, 2, 2]
data1 = pd.DataFrame(odict)
data2 = pd.DataFrame(odict)
frames = [data1, data2]
data = pd.concat(frames)
data


    b    a
0   1    2
1   1    2
2   1    2
0   1    2
1   1    2
2   1    2

这应该会起作用。

您也可以这样指定顺序:

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]})
listdf = [data1, data2]
data = pd.concat(listdf)
sequence = ['b','a']
data = data.reindex(columns=sequence)

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

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)

pandas的未来版本默认情况下将更改为不排序。

最简单的方法是先使列的顺序相同,然后再进行排序:

df2=df2[df1.columns]
df=pd.concat((df1,df2),axis=0)

Dict的可能重复项没有排序,那么为什么要对列进行排序呢?谢谢,在我的例子中,数据帧是从已经存在的CSV文件创建的,这很好。这在Python 3.7中“正常”吗?DICT保证维持其顺序。作为改进,您不必手动指定列。你可以做
combined=pd.concat([df1,df2])[df1.columns]
。这假设您已经有了一个数据框,其中列的顺序与您想要的一致。但这就是我的情况。要演示
sort=False
vs
sort=True
最后一行应该是
df=pd.concat([df2,df1],sort=False)
。然后,列的顺序将根据排序而有所不同。
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]})
listdf = [data1, data2]
data = pd.concat(listdf)
sequence = ['b','a']
data = data.reindex(columns=sequence)
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)
df2=df2[df1.columns]
df=pd.concat((df1,df2),axis=0)