【问题标题】:convert list of dicts to pandas dataframe将字典列表转换为熊猫数据框
【发布时间】:2017-12-12 18:10:44
【问题描述】:

这是我的数据集

我有一个奇怪的问题,我已经做了一周的工作,现在需要一些帮助。我有一个这样的字典列表:

[index 0 : {'Total_Salary': 49900.0, 'Total_Value': 490.0, 
 'pers_1': {'value': 71.1, 'Name': 'Bob', 'Salary': 10100, 'nick_name': 'foo'}, 
 'pers_2': {'value': 43.1, 'Name': 'Joe', 'Salary': 9200, 'nick_name': 'bar'}}
 'pers_3': {'value': 42.1, 'Name': 'james', 'Salary': 9750, 'nick_name': 'sam'}}
 'pers_4': {'value': 41.1, 'Name': 'rick', 'Salary': 9700, 'nick_name': 'suzy'}}
 'pers_5': {'value': 23.1, 'Name': 'blop', 'Salary': 9400, 'nick_name': 'jill'}}
 'pers_6': {'value': 54.1, 'Name': 'burp', 'Salary': 9280, 'nick_name': 'yup'}}

索引1:(总工资,总价值数字会有所不同,因为人会改变,但格式和上面一样) ... 索引 n:'Total_Salary' = ...,'Total_Value' = ...,person_n ... ]

字典列表中的每个字典都有一个 total_salary 和 total_value 键。它是从第 1 个人到第 6 个人前面的每个人“薪水”和“价值”的总和。该列表有数百个字典,就像上面附加的一样。我想遍历字典列表并将每个字典放入一个数据帧中。

理想情况下,数据帧将使用 Team 1 作为索引(然后是 team 2team 3 等)进行索引。

【问题讨论】:

  • 你能详细说明一下这个例子吗?它似乎不清楚您拥有的字典的格式。 total_salary、total_value 之间是否再次重复?请指定一个完整的示例。
  • 对不起,我总是很难解释,让我编辑...
  • 我建议显示所需的输出,特别是因为您有一个 nested 字典,它扩展了可能的解决方案的数量
  • 添加了一张我希望它看起来如何的图片
  • 数据格式是否正确? [index 0 : 正确吗?字典的括号是否一致?

标签: python python-3.x pandas dictionary dataframe


【解决方案1】:
import pandas as pd

team = {
    'pers_1': {'value': 71.1, 'Name': 'Bob', 'Salary': 10100, 'nick_name': 'foo'}, 
    'pers_2': {'value': 43.1, 'Name': 'Joe', 'Salary': 9200, 'nick_name': 'bar'},
    'pers_3': {'value': 42.1, 'Name': 'james', 'Salary': 9750, 'nick_name': 'sam'},
    'pers_4': {'value': 41.1, 'Name': 'rick', 'Salary': 9700, 'nick_name': 'suzy'},
    'pers_5': {'value': 23.1, 'Name': 'blop', 'Salary': 9400, 'nick_name': 'jill'},
    'pers_6': {'value': 54.1, 'Name': 'burp', 'Salary': 9280, 'nick_name': 'yup'}}

df = (pd.DataFrame(team)
      .T
      .append(pd.Series({'value': df['value'].sum(),
                         'Salary': df['Salary'].sum()},
                        name='Total'))
      .assign(team='team_1')
      .set_index('team', append=True)
      .swaplevel())

print(df)

结果

                Name  Salary nick_name  value
team                                         
team_1 pers_1    Bob   10100       foo   71.1
       pers_2    Joe    9200       bar   43.1
       pers_3  james    9750       sam   42.1
       pers_4   rick    9700      suzy   41.1
       pers_5   blop    9400      jill   23.1
       pers_6   burp    9280       yup   54.1
       Total     NaN  172290       NaN  823.8

您可以对其他团队执行相同的操作,然后连接所有数据框。在混合伪代码中:

all_teams_list = []
# loop for all teams
    # create `df`
    all_teams_list.append(df)
all_teams = pd.concat(all_teams_list)

【讨论】:

  • 谢谢。我现在正在将它绑定到主程序中,将更新。看起来这样可以解决问题......
  • 所以我在那里的代码取得了一些进展,但我无法让它执行多索引
  • 纳米。 Gui9lherme 的回答是正确的,事实后我在打开的窗口中显示数据的方式误导了我对数据的最终结构。感谢您的帮助。
猜你喜欢
  • 2018-11-25
  • 1970-01-01
  • 2016-09-06
  • 2019-07-18
  • 2018-07-14
  • 2019-05-07
  • 2017-10-02
  • 2021-09-07
相关资源
最近更新 更多