【问题标题】:How to make a list of dictionaries from a pandas DataFrame?如何从 pandas DataFrame 制作字典列表?
【发布时间】:2019-04-14 01:31:37
【问题描述】:

我希望尝试建立一个包含特定词典的列表。我希望结构类似于以下内容:

[{'label': 'Abdelnaby, Alaa', 'value': '76001'},
{'label': 'Abdul-Aziz, Zaid', 'value': '76002'},
{'label': 'Abdul-Jabbar, Kareem', 'value': '76003'}]

目前,我从中提取的数据位于 pandas 数据框中。下面的例子...

PlayerID    Name     Current Player First Season    Last Season
76001   Abdelnaby, Alaa       0     1990            1994
76002   Abdul-Aziz, Zaid      0     1968            1977
76003   Abdul-Jabbar, Kareem  0     1969            1988
51      Abdul-Rauf, Mahmoud   0     1990            2000
1505    Abdul-Wahad, Tariq    0     1997            2003

请让我知道这是否足够。非常感谢您的帮助!

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    选择您的列,重命名它们并使用orient='records' 调用to_dict 以获取字典列表,

    (df.reindex(['Name', 'PlayerID'], axis=1)
       .set_axis(['label', 'value'], axis=1, inplace=False)
       .to_dict('r'))    
    
    # [{'label': 'Abdelnaby, Alaa', 'value': 76001},
    #  {'label': 'Abdul-Aziz, Zaid', 'value': 76002},
    #  {'label': 'Abdul-Jabbar, Kareem', 'value': 76003},
    #  {'label': 'Abdul-Rauf, Mahmoud', 'value': 51},
    #  {'label': 'Abdul-Wahad, Tariq', 'value': 1505}]
    

    您可以通过将.to_dict('r') 更改为.to_json(orient='records') 来输出JSON。


    如果性能很重要,这里有一个带有列表理解构造的优化解决方案。

    [dict(zip(('label', 'value'), r)) for r in df[['Name', 'PlayerID']].values]
    
    # [{'label': 'Abdelnaby, Alaa', 'value': 76001},
    #  {'label': 'Abdul-Aziz, Zaid', 'value': 76002},
    #  {'label': 'Abdul-Jabbar, Kareem', 'value': 76003},
    #  {'label': 'Abdul-Rauf, Mahmoud', 'value': 51},
    #  {'label': 'Abdul-Wahad, Tariq', 'value': 1505}]
    

    【讨论】:

    • 相反,如果你想将这些dicts列表转换回DataFrame,你可以查看here的方法。
    • 只是好奇,为什么要使用 .reindex(axis =1),而不是仅仅使用 [[ ]] 并选择列?
    • @BenPap 方法一路链接!
    • @coldspeed 我猜在这种情况下字典理解可能会快一点。
    【解决方案2】:

    如果速度是问题,我们可以使用 dict comp:

    myjson = [{'label': name, 'value': pid} for pid,name in zip(df['PlayerID'], df['Name'])]
    

    给予:

    [{'label': 'Abdelnaby, Alaa', 'value': 76001},
     {'label': 'Abdul-Aziz, Zaid', 'value': 76002},
     {'label': 'Abdul-Jabbar, Kareem', 'value': 76003},
     {'label': 'Abdul-Rauf, Mahmoud', 'value': 51},
     {'label': 'Abdul-Wahad, Tariq', 'value': 1505}]
    

    另外,如果你想把数据写成json

    import json
    with open('myjson.json','w') as fo:
        json.dump(myjson,fo,indent=4)
    

    速度对比

    %%timeit
    myjson = [{'label': name, 'value': pid} for pid,name in zip(df['PlayerID'].values, df['Name'].values)]
    
    5.9 µs ± 125 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
    
    
    %%timeit
    myjson = (df.reindex(['Name', 'PlayerID'], axis=1)
       .set_axis(['label', 'value'], axis=1, inplace=False)
       .to_dict('record')
    )
    756 µs ± 24.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    

    【讨论】:

      【解决方案3】:

      玩家ID 姓名 当前玩家 第一赛季 上赛季 76001 阿卜杜勒纳比,阿拉巴 0 1990 1994 76002 阿卜杜勒-阿齐兹,扎伊德 0 1968 1977 76003 阿卜杜勒-贾巴尔,卡里姆 0 1969 1988 51 Abdul-Rauf, Mahmoud 0 1990 2000 1505 Abdul-Wahad, 塔里克 0 1997 2003

      #You already have a data frame 
      dataframe="your data frame"
      #us iloc 
      values=dataframe.iloc[:,0]# u have all rows n 0th col
      label=dataframe.iloc[:,1] #u have all rows n 1st col
      dic={}
      
          for i,val in values:
               dic[val]=lable[i]
      
      #hope the logic is clear.
      

      【讨论】:

        猜你喜欢
        • 2021-06-20
        • 2016-01-15
        • 2021-11-10
        • 1970-01-01
        • 2017-12-26
        • 2019-02-08
        • 2019-04-28
        • 1970-01-01
        • 2019-01-05
        相关资源
        最近更新 更多