python - 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 个我们的开发团队使用的额外标签。
解决方案
推荐阅读
- java - 如何编写Java语句来显示2个数字之间的整数?
- android - 如何从奥利奥的内部存储中打开 PDF 文件?
- java - 使用 Java Stream 比较两个整数数组
- vba - 如何从 Outlook 电子邮件正文中复制电子邮件地址并将其插入新电子邮件的收件人字段?
- eclipse - 对 RDD 元组比较
- java - JAVA - SPRING - 请求被拒绝,因为没有找到多部分边界
- javascript - 使用 ng repeat 将 Angularjs $index 传递给 onchange 并且输入类型是文件
- java - Rxjava:也许是带有可完成的平面图
- python - TypeError:'int' 对象在 Python 3 中不可调用
- java - 套接字——如何处理?