【问题标题】:Python: parsing dictionary keys to values in a tablePython:将字典键解析为表中的值
【发布时间】:2020-03-31 10:13:11
【问题描述】:

我正在尝试将高度嵌套的 JSON 文件转换为可以轻松加载到数据库表中的数据格式。我一直在使用pandas 库中的json_normalize 将文件的各个部分展平为表格格式。这大部分都有效,但是我遇到了具有以下结构的部分:

{"data": {
    "Revenue": {
        "2019-05-31": 50,
        "2018-05-31": 60,
        "2017-05-31": 70,
        "2016-05-31": 75,
        "2015-05-31": 90,
        "2014-05-31": 100
    },
    "Cost of Revenue": {
        "2019-05-31": 45,
        "2018-05-31": 40,
        "2017-05-31": 57,
        "2016-05-31": 58,
        "2015-05-31": 68,
        "2014-05-31": 70
    }
    }}

我想将此数据转换为以下格式(假设这是构造此类数据的最佳方式):

measure                 period end     value
Revenue                 2019-05-31     50
Revenue                 2018-05-31     60
Revenue                 2017-05-31     70
Revenue                 2016-05-31     75
Revenue                 2015-05-31     90
Revenue                 2014-05-31     100
Cost of Revenue         2019-05-31     45
Cost of Revenue         2018-05-31     40
Cost of Revenue         2017-05-31     57
Cost of Revenue         2016-05-31     58
Cost of Revenue         2015-05-31     68
Cost of Revenue         2014-05-31     70

我不会提前知道“measure”和“period end”键名是什么,但它总是具有上述结构。我还没有找到一个通用的解决方案,但我对 Python 还是很陌生。

任何帮助或指导将不胜感激。

【问题讨论】:

  • 非常感谢,我已经尝试过 'json_normalize',它将为我提供组合度量和期末作为列标题(即收入成本_2014-05-31)。我正在考虑转置它,然后在 '_' 上拆分以将其重新放入列中,但是这样做似乎有点混乱。

标签: python json csv dictionary


【解决方案1】:

一种方法是将“数据”部分加载到 DataFrame 中并将其堆叠。

df = pd.DataFrame.from_dict(data['data'], orient='index').stack().reset_index()
df.columns = ['measure', 'period end', 'value']
df

它会给你如下输出

    measure     period end  value
0   Revenue     2019-05-31  50
1   Revenue     2018-05-31  60
2   Revenue     2017-05-31  70
3   Revenue     2016-05-31  75
4   Revenue     2015-05-31  90
5   Revenue     2014-05-31  100
6   Cost of Revenue     2019-05-31  45
7   Cost of Revenue     2018-05-31  40
8   Cost of Revenue     2017-05-31  57
9   Cost of Revenue     2016-05-31  58
10  Cost of Revenue     2015-05-31  68
11  Cost of Revenue     2014-05-31  70

【讨论】:

  • 非常好,非常感谢,在将 pd.DataFrame.from_dict(data['data'], orient='index').stack().reset_index() 更改为 df = pd.DataFrame.from_dict(data['data'], orient='index').stack().reset_index() 后它运行良好,这正是我想要的。我不确定它是如何工作的,但至少我知道我需要学习什么。再次感谢。
猜你喜欢
  • 2023-03-15
  • 2018-02-11
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
相关资源
最近更新 更多