Python 从字典列表创建数据帧时,指定列的顺序

Python 从字典列表创建数据帧时,指定列的顺序,python,pandas,dataframe,dictionary,Python,Pandas,Dataframe,Dictionary,我有一个方法,它创建一个列表、结果,然后向其追加一个dict行,该行在最终数据帧中有keys列名,在最终数据帧中有values行值。然后我附加行,并在末尾将结果集合转换为df。例如: results = [] row = {} row['Name']="alice" row['Age']=3 results.append(row) ..reset row, fill in values like above, and append more rows.. df = pd.DataFrame(r

我有一个方法,它创建一个列表、结果,然后向其追加一个dict行,该行在最终数据帧中有keys列名,在最终数据帧中有values行值。然后我附加行,并在末尾将结果集合转换为df。例如:

results = []
row = {}
row['Name']="alice"
row['Age']=3
results.append(row)
..reset row, fill in values like above, and append more rows..

df = pd.DataFrame(results)
我遇到的问题是列名是alphbetized的,因此df如下所示:

df.head()
|Age |  Name  |
|3   | alice  |
有没有办法按照我想要的顺序指定列名,Col?事实上,我有更多的专栏,所以我不想做:

cols = df.columns
cols = cols[:1] + cols[0:1] 

并手动重新排列它。但是,如果我这样做了,那是仅仅在列行中移动还是在下面的行中移动?因此,下面一行中的alice和3是否也会在移动列时按预期移动?

为columns属性指定所需顺序的列表,DataFrame将在创建DataFrame时对列重新排序

pd.DataFrame(results, columns=['Name', 'Age'])

    Name  Age
0  alice    3
或者,DataFrame.from_records也会这样做

pd.DataFrame.from_records(results, columns=['Name', 'Age'])

    Name  Age
0  alice    3
如果您正在处理多个列,您可以始终选择执行columns=['Name','Age',*row.keys-{'Name','Age'}],假设您不关心其余列的顺序

我在这篇文章中写过关于从记录构建数据帧的内容:

另一个想法是,如果顺序不正确,修复列

if df.columns.get_loc('Age') < df.columns.get_loc('Name'):
    df.insert(df.columns.get_loc('Age'), 'Name', df.pop('Name'))
如果最初在年龄之后插入姓名,则会在年龄之前插入姓名。

IIUC:

df = pd.DataFrame(results,columns=list(row.keys()))
#from collections import OrderedDict :alternative
#columns=[i for i in OrderedDict.fromkeys(row.keys())]
print(df)
,从pandas 0.23和python 3.6开始,当从dicts构造时,顺序将保持不变。您可以简单地使用OrderedICT


在python版本@cs95上保证所需的顺序好吗?这一点没有经过测试,只是假设他们是从头开始创建记录,这通常不是事实,但仍然是一个有效的建议。
    Name  Age
0  alice    3
import pandas as pd
from collections import OrderedDict


results = []
row = OrderedDict()

row['Name']="alice"
row['Age']=3
results.append(row)
#..reset row, fill in values like above, and append more rows..

df = pd.DataFrame(results)
print(df.head())

    Name  Age
0  alice    3