Pandas:创建DataFrame时不自动按字母顺序排序列名

15

我正在创建一个初始的pandas数据框来存储从其他代码生成的结果,例如:

result = pd.DataFrame({'date': datelist, 'total': [0]*len(datelist), 
                       'TT': [0]*len(datelist)})

使用预定义列表datelist,其他代码将为每个date输出一些数字,存储在result数据帧中的totalTT中。

因此,我想要第一列是date,第二列是total,第三列是TT。然而,创建时Pandas会自动按字母顺序重新排序为TTdatetotal。虽然可以之后手动重新排序,但我想知道是否有更简单的方法在一步中实现这一点。

我发现也可以这样做

result = pd.DataFrame(np.transpose([datelist, [0]*l, [0]*l]),
                      columns = ['date', 'total', 'TT'])

但它看起来有点乏味。还有其他建议吗?


如果我使用df = pd.DataFrame(columns = ['b','a']),它将保留顺序,但如果我使用df = pd.DataFrame(columns = {'b','a'}),列名的顺序将被更改为'a' 'b',这背后有什么原因吗? - Jason Goal
3个回答

15
您可以将按正确顺序排列的列列表作为参数传递给构造函数或使用OrderedDict:
# option 1:
result = pd.DataFrame({'date': datelist, 'total': [0]*len(datelist), 
                   'TT': [0]*len(datelist)}, columns=['date', 'total', 'TT'])

# option 2:
od = collections.OrderedDict()
od['date'] = datelist
od['total'] = [0]*len(datelist)
od['TT'] = [0]*len(datelist)
result = pd.DataFrame(od)

3
应该可以工作,pandas明确检查它:https://github.com/pydata/pandas/blob/master/pandas/core/frame.py#L397 - wonce
哈哈,你说得对,我完全搞砸了我的 OrderedDict 定义 :) 谢谢,很抱歉。 - Andras Deak -- Слава Україні
正如其他答案所建议的那样,如果像你第一行所示地执行 result = pd.DataFrame({'date': datelist, 'total': [0]*len(datelist), 'TT': [0]*len(datelist)}, columns=['date', 'total', 'TT']),那么它似乎已经给出了正确的顺序,因此其余部分是不必要的?或者我漏掉了什么吗? - hurrikale
如果我只是简单地复制并粘贴你的所有代码,实际上只会给我一个只有一列“日期”的数据框。 - hurrikale
我明白了!看起来我需要在DataFrame中显式添加column参数,或者创建一个OrderedDict并逐个插入每个组件。谢谢! - hurrikale
显示剩余5条评论

3
result = pd.DataFrame({'date': [23,24], 'total': 0,
                       'TT': 0},columns=['date','total','TT'])

2

3
有一个注意点,它适用于字典中的列表,但不适用于字典的列表。即使所有字典都具有相同的插入顺序,列仍按字母顺序排序。(已在pandas 0.24.2和Python 3.7下测试) - hugovdberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接