【问题标题】:Specify ordering for columns when creating a DataFrame from list of dictionaries从字典列表创建 DataFrame 时指定列的顺序
【发布时间】:2019-10-20 05:11:15
【问题描述】:

我有一个方法可以创建一个列表、结果,然后向其附加一个 dict 行,该行具有键(我的最终数据框中的列名)和值(我的最终数据框中的行值)。然后我附加该行并将结果集合转换为最后的 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)

我遇到的问题是列名是字母化的,所以 df 看起来像这样:

df.head()
|Age |  Name  |
|3   | alice  |

有没有办法按照我想要的顺序指定列名(“Name”、“Col”)?实际上我有更多的专栏,所以我不想这样做:

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

并手动重新排列它。但是,如果我这样做,那只是在列行或下面的行周围移动吗?那么,下面行中的“alice”和 3 在移动列的同时也会像人们预期的那样移动吗?

【问题讨论】:

    标签: python pandas dataframe dictionary


    【解决方案1】:

    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'})],前提是您不关心其余列的顺序。

    我在这篇文章中写过关于从记录中构造 DataFrame:Convert list of dictionaries to a pandas DataFrame


    另一个想法,如果排序不正确,请修复列。

    if df.columns.get_loc('Age') < df.columns.get_loc('Name'):
        df.insert(df.columns.get_loc('Age'), 'Name', df.pop('Name'))
    

    如果原来在 Age 之后插入 Name,这将在 Age 之前插入 Name。

    【讨论】:

      【解决方案2】:

      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)
      

          Name  Age
      0  alice    3
      

      【讨论】:

      • 在 python 版本
      • @cs95 好点,未针对 &lt;3.6 进行测试,适用于我的版本。 :) [i for i in OrderedDict.fromkeys(row.keys())] 怎么样??
      【解决方案3】:

      According to the docs,从 pandas 0.23 和 python 3.6 开始,从 dicts 构造时,将保持顺序。你可以简单地使用OrderedDict

      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
      

      【讨论】:

      • 这只是假设他们从头开始创建记录(通常情况并非如此,但仍然是一个有效的建议)。
      猜你喜欢
      • 1970-01-01
      • 2017-06-26
      • 2020-08-31
      • 2015-10-02
      • 2021-07-03
      • 2020-07-06
      • 2021-05-25
      • 2021-06-20
      • 2018-03-20
      相关资源
      最近更新 更多