【问题标题】:Convert pandas.DataFrame to list of dictionaries in Python将 pandas.DataFrame 转换为 Python 中的字典列表
【发布时间】:2018-08-08 05:35:55
【问题描述】:

我有一个从数据框转换而来的字典,如下所示:

a = d.to_json(orient='index')

字典:

{"0":{"yr":2017,"PKID":"58306, 57011","Subject":"ABC","ID":"T001"},"1":{"yr":2018,"PKID":"1234,54321","Subject":"XYZ","ID":"T002"}}

我需要的是它在一个列表中,所以本质上是一个字典列表。 所以我只是添加了一个 [],因为这是其余代码中要使用的格式。

input_dict = [a]

输入字典:

['
{"0":{"yr":2017,"PKID":"58306, 57011","Subject":"ABC","ID":"T001"},"1":{"yr":2018,"PKID":"1234,54321","Subject":"XYZ","ID":"T002"}}
']

我需要在 [ 之后和 ] 之前删除单引号。另外,以列表的形式获取 PKID 值。

如何做到这一点?

预期输出:

[ {"yr":2017,"PKID":[58306, 57011],"Subject":"ABC","ID":"T001"},"1":{"yr":2018,"PKID":[1234,54321],"Subject":"XYZ","ID":"T002"} ]

注意:PKID 列有多个整数值,它们必须作为整数的提升。字符串是不可接受的。 所以我们需要像 "PKID":[58306, 57011] 而不是 "PKID":"[58306, 57011]"

【问题讨论】:

  • “我需要的是它在一个列表中,所以本质上是一个字典列表”:对不起,但这不足以保证正确的答案 - 请发布确切你期望的结果。
  • 感谢布鲁诺强调,我现在添加了预期结果。

标签: python json pandas dictionary dataframe


【解决方案1】:

这是一种方法:

from collections import OrderedDict

d = {"0":{"yr":2017,"PKID":"58306, 57011","Subject":"ABC","ID":"T001"},"1":{"yr":2018,"PKID":"1234,54321","Subject":"XYZ","ID":"T002"}}

list(OrderedDict(sorted(d.items())).values())

# [{'ID': 'T001', 'PKID': '58306, 57011', 'Subject': 'ABC', 'yr': 2017},
#  {'ID': 'T002', 'PKID': '1234,54321', 'Subject': 'XYZ', 'yr': 2018}]

请注意,有序字典按提供的文本字符串键排序。您可能希望在通过d = {int(k): v for k, v in d.items()} 进行任何处理之前先将它们转换为整数。

【讨论】:

  • dicts 是无序的,所以这不会保留键隐含的(最终)排序......对于 OP 来说可能是也可能不是问题......
  • 关闭但不完全在那里 - 这里的键是字符串,所以你会得到词法排序(即:sorted(["1", "2", "10", "11"]) => ['1', '10', '11', '2'])。您想在恕我直言之前将键转换为整数;)
  • 正如我最初提到的那样:这个“可能或不是 OP 的问题” - 但我们实际上不知道,因为 OP 没有发布确切的预期输出(显然每个人都解释了不同);)我只是想说明你的第一个解决方案最终会松散排序,而第二个解决方案将使用词汇排序而不是数字排序,仅此而已。
【解决方案2】:

您正在将您的字典转换为json,这是一个字符串。然后你把你的结果字符串包装成一个列表。因此,结果自然是列表中的字符串。

改用:[d] 其中d 是您的原始字典(未转换的json

【讨论】:

    【解决方案3】:

    你可以使用列表推导

    例如:

    d = {"0":{"yr":2017,"PKID":"58306, 57011","Subject":"ABC","ID":"T001"},"1":{"yr":2018,"PKID":"1234,54321","Subject":"XYZ","ID":"T002"}}
    print [{k: v} for k, v in d.items()]
    

    输出:

    [{'1': {'PKID': '1234,54321', 'yr': 2018, 'ID': 'T002', 'Subject': 'XYZ'}}, {'0': {'PKID': '58306, 57011', 'yr': 2017, 'ID': 'T001', 'Subject': 'ABC'}}]
    

    【讨论】:

      【解决方案4】:

      pandas.DataFrame.to_json 返回一个字符串(JSON 字符串),而不是字典。改用to_dict

      >>> df
         col1  col2
      0     1     3
      1     2     4
      >>> [df.to_dict(orient='index')]
      [{0: {'col1': 1, 'col2': 3}, 1: {'col1': 2, 'col2': 4}}]
      >>> df.to_dict(orient='records')
      [{'col1': 1, 'col2': 3}, {'col1': 2, 'col2': 4}]
      

      【讨论】:

      • 谢谢,还有没有办法不使用相同格式的索引值?就像:[' {"yr":2017,"PKID":"58306, 57011","Subject":"ABC","ID":"T001"},{"yr":2018,"PKID": "1234,54321","主题":"XYZ","ID":"T002"} ']
      • @ShankarPandey 我添加了另一个示例
      • 谢谢。有没有办法也将一列值作为列表。所以如果 col2 有 2 个用逗号分隔的整数,我们将如何在下面做一个例子: [{'col1': 1, 'col2': [3, 4] }, {'col1': 2, 'col2': [ 5,6] }]
      • @ShankarPandey 只需遍历列表并转换您的值:d['PKID'] = list(map(int, d['PKID'].split(',')))
      【解决方案5】:

      这样的事情怎么样:

      from operator import itemgetter
      
      d = {"0":{"yr":2017,"PKID":"58306, 57011","Subject":"ABC","ID":"T001"},"1":
          {"yr":2018,"PKID":"1234,54321","Subject":"XYZ","ID":"T002"}}
      
      sorted_d = sorted(d.items(), key=lambda x: int(x[0]))
      
      print(list(map(itemgetter(1), sorted_d)))
      

      哪些输出:

      [{'yr': 2017, 'PKID': '58306, 57011', 'Subject': 'ABC', 'ID': 'T001'}, 
       {'yr': 2018, 'PKID': '1234,54321', 'Subject': 'XYZ', 'ID': 'T002'}]
      

      【讨论】:

        猜你喜欢
        • 2019-02-10
        • 2015-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-14
        • 2016-10-25
        • 2022-12-04
        • 2011-11-18
        相关资源
        最近更新 更多