【问题标题】:Turn a single entry in a dictionary of dictionaries into a dataframe where keys are the columns将字典字典中的单个条目转换为键是列的数据框
【发布时间】:2019-11-04 08:15:48
【问题描述】:

给定一个字典,例如:

records = {0:{'name':'John', 'salary':'5000'}, 1:{'name':'Bob', 'salary':'3500'}}

如果我想获取和存储(在 csv 中)数据框,例如:

name  salary
John   5000

通过使用 records[0] 作为访问内部字典的一种方式,我该怎么做?

我试过了:

df = pd.DataFrame(records[0], index=[0])

df= pd.DataFrame(list(records[0].values()), columns=list(records[0].keys()))

df= pd.DataFrame.from_dict(records[key], orient='columns')

但是它们都没有按预期工作(第二个给了我一个错误,第一个和最后一个只有一列)

【问题讨论】:

  • 字典并不总是以特定的方式排序。在选择所需数据之前,您是否以某种方式订购它?原始字典是如何创建的?你总是只需要第一个值吗?
  • 使用 pandas 从 csv 文件制作数据帧 > 转向 dict > 开始循环:: 使用 dict 中的键:循环每个“行” > 添加两个字段 > 将行附加到最初为空的 csv文件 > 结束循环
  • 为什么需要 pandas 来写入 csv 文件?您可以将字典写入 csv:stackoverflow.com/questions/10373247/…

标签: python pandas dataframe dictionary


【解决方案1】:

DataFrame.from_dictorient='index' 一起使用:

df = pd.DataFrame.from_dict(records, orient='index')
print (df)
   name salary
0  John   5000
1   Bob   3500

编辑 - 将record 的第一个值传递给嵌套列表:

df = pd.DataFrame([records[0]])
print (df)
   name salary
0  John   5000

【讨论】:

  • 我只想将第一个条目转换为数据框。我不想两个都转,我已经知道该怎么做了。
  • 我不想将其全部转换为数据框,因为我正在处理包含数千个条目的字典,并且我将在遍历字典时的每一步都执行此操作。该字典来自一个大于 500mb 的 csv 文件,因此我认为将整个内容转换为数据框并在每次迭代中建立索引将花费太多时间。
  • @MohamadMoustafa 您是将整个文件转换为 csv 表还是仅转换为子集?您正在使用字典,因此您可以遍历字典并只保留您想要的内容,然后再将其转换为数据框。 (或阅读 csv 行并将您想要的内容放入数据框中)。
  • 使用它只打开第一个条目 - pd.DataFrame.from_dict([records[0]], orient='columns')
  • 我使用 to_dict 将使用 csv 文件创建的整个数据框转换为 dict。然后,我遍历每个“行”(dict 内的字典),进行更改,将“行”转换为数据框,并将其附加到空的 csv 文件中。
【解决方案2】:

您可以使用DataFrame.from_dict()DataFrame.T 的组合:

records = {0:{'name':'John', 'salary':'5000'}, 1:{'name':'Bob', 'salary':'3500'}}
pd.DataFrame.from_dict(records).T

输出

+----+-------+--------+
|    | name  | salary |
+----+-------+--------+
| 0  | John  |   5000 |
| 1  | Bob   |   3500 |
+----+-------+--------+

编辑 只获取第一条记录

df[df.index==0]
+----+-------+--------+
|    | name  | salary |
+----+-------+--------+
| 0  | John  |   5000 |
+----+-------+--------+

【讨论】:

  • 不错的输出表示。
猜你喜欢
  • 1970-01-01
  • 2021-06-19
  • 2022-07-05
  • 2019-04-21
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
  • 2020-03-28
  • 2016-10-23
相关资源
最近更新 更多