首页 > 解决方案 > json_normalize CSV 内的嵌套 json 对象

问题描述

我正在编写一个脚本,该脚本调用我们的 Azure 成本管理端点来检索利用率指标。有效负载以 csv 格式返回,并且所有列都整齐地对齐,除了我们在 Azure 中使用的内部资源标签。

那些作为 csv 列内的嵌套 json 回来。我一直在尝试使用 json_normalize 来展平标签列,但运气不佳。下面是数据源的行示例(绿色标记是我对 csv 中的 json 进行展平的愿望):

在此处输入图像描述

我已经尝试了许多在堆栈上和其他在线资源中找到的方法,但一直陷入死胡同。

作为一个实验,我取了一行并将其转换为一个 json 对象:

df = pd.read_csv('data_in/2020-04-06_azure.csv')
d1 = df[250:251]
d2 = d1.to_json(orient='split')
print(d2)

这给了我这个:

{
  "columns": [
    "Service",
    "Category",
    "Date",
    "Cost",
    "Subscription",
    "ResourceGroup",
    "Tags",
    "Id"
  ],
  "index": [
    250
  ],
  "data": [
    [
      "Azure",
      "Bandwidth",
      "2020-04-05",
      0.0000038429,
      "Production",
      "testclient-prod-rg",
      "{  \"Client\": \"Client A\",  \"Budget\": \"Research-and-Development\",  \"Description\": \"resource group for testclient storage account\",  \"Name\": \"filler\",  \"Owner\": \"some@email.com\"}",
      "/subscriptions/subid/resourceGroups/testclient-prod-rg/providers/Microsoft.Storage/storageAccounts/ccsmtestclientdata"
    ]
  ]
}

如果我对上述数据帧运行 json_normalize ,print(json_normalize(d2))它将失败: AttributeError: 'str' object has no attribute 'values'

所以我尝试做一个更简单的实验......从标签列的一行示例中创建一个数据框,并尝试规范化单个实例:

df = pd.read_csv('data_in/2020-04-06_azure.csv')
d1 = df[250:251]
d2 = d1['Tags']
print(d2)
Output:
250    {  "Client": "Test",  "Budget": "Research-and...
Name: Tags, dtype: object

尝试规范化 json

print(json_normalize(d2))
Output:
AttributeError: 'str' object has no attribute 'values'

编辑:根据下面的评论,我想从 json_normalize 看到的是:

Tags.Client | Tags.Budget | Tags.Blah | Tags.Etc
--------------------------------------------------
Client A    | Production  | Value Foo | Value Bar

我是 python 新手,所以如果这看起来很简单,我很抱歉 - 我不明白数据框中没有值。

我也尝试过的其他方法是使用 json.load 和 json.dumps 创建一个迭代器来尝试和操作它。我认为我的下一步是制作一个正则表达式迭代器来循环遍历行并提取/附加标签字段中的每个项目。

具有挑战性的部分是 csv 中的标签 JSON 不一致 - 因此某些行将具有空值,而另一行可能具有“客户”和“预算”,还有一些可能有 5 或 6 个我们的开发团队使用的额外标签。

标签: pythonjsonpandasazurecsv

解决方案


推荐阅读