【问题标题】:Pandas: create dataframe without auto ordering column names alphabeticallyPandas:创建数据框而不按字母顺序自动排序列名
【发布时间】:2017-02-13 04:41:18
【问题描述】:

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

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

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

所以我希望第一列为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',这背后有什么原因吗?

标签: python pandas dataframe


【解决方案1】:

您可以将(正确排序的)列列表作为参数传递给构造函数或使用 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)

【讨论】:

  • 我本来打算建议OrderedDict,但它不起作用,它可能只是被转换为dict。我没有得到可重复的订单。
  • 它应该可以工作,pandas 明确检查它:github.com/pydata/pandas/blob/master/pandas/core/frame.py#L397
  • 哈哈,你说得对,我完全搞砸了我的OrderedDict 定义:)谢谢,对不起。
  • 正如另一个答案所建议的那样,如果result = pd.DataFrame({'date': datelist, 'total': [0]*len(datelist), 'TT': [0]*len(datelist)}, columns=['date', 'total', 'TT']),就像你的第一行那样,那么它似乎已经给出了正确的顺序,所以剩下的就没有必要了吗?还是我错过了什么?
  • 如果我只是复制并粘贴你所有的代码,它实际上只给了我一个带有一列 date 的数据框。
【解决方案2】:
result = pd.DataFrame({'date': [23,24], 'total': 0,
                       'TT': 0},columns=['date','total','TT'])

【讨论】:

    【解决方案3】:

    将 pandas >= 0.23 与 Python >= 3.6 结合使用。

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

    在结合 Python3.6 使用 pandas v0.23.0 时,从 dict 创建 DataFrame(或 Series)时保留 dict 的插入顺序。

    https://pandas.pydata.org/pandas-docs/version/0.23.0/whatsnew.html#whatsnew-0230-api-breaking-dict-insertion-order

    【讨论】:

    • 有一个警告,它适用于lists 的dict,但不适用于dicts 的list。即使所有 dicts 具有相同的插入顺序,列仍然按字母顺序排序。 (使用pandas 0.24.2 和 Python 3.7 测试)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 2022-06-24
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多