如何将python中的类转换为pandas数据框?
Posted
技术标签:
【中文标题】如何将python中的类转换为pandas数据框?【英文标题】:How to transform a class in python into a pandas dataframe? 【发布时间】:2019-10-31 22:50:51 【问题描述】:我正在尝试从 python 中的类对象创建熊猫数据框。
类对象是我从以下教程中得到的 postman python 脚本的输出:https://developer.cisco.com/meraki/build/meraki-postman-collection-getting-started/
我希望得到这个的输出
print(response.text)
给出:
["id":578149602163689207,"name":"Axel Network Test","id":578149602163688579,"name":"Your org","id":578149602163688880,"name":"Your org","id":578149602163688885,"name":"Your org","id":578149602163689038,"name":"Tory's Test Lab",.......
我想将其放入带有 ID 列和名称列的 pandas 数据框中。
import requests
import pandas as pd
url = "https://api.meraki.com/api/v0/organizations"
headers =
'X-Cisco-Meraki-API-Key': "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
'User-Agent': "PostmanRuntime/7.15.0",
'Accept': "*/*",
'Cache-Control': "no-cache",
'Postman-Token': "7d29cb4e-b022-4954-8fc8-95e5361d15ba,1a3ec8cb-5da8-4983-956d-aab45ed00ca1",
'accept-encoding': "gzip, deflate",
'referer': "https://api.meraki.com/api/v0/organizations",
'Connection': "keep-alive",
'cache-control': "no-cache"
response = requests.request("GET", url, headers=headers)
写累了
df = pd.DataFrame(response, columns=['id', 'name'])
但这会产生很多错误。
查看错误日志:https://pastebin.com/4BKFYng1
我怎样才能实现我想要的?
【问题讨论】:
“产生很多错误”:你能提供完整的错误回溯吗? 告诉我们什么是错误 @amanb pastebin.com/4BKFYng1 我认为您刚刚泄露了您的 API 密钥,您可能想要更改它;-) @RobinNemeth 这只是教程中的一个,别担心 :) 【参考方案1】:read_json 接受 JSON 字符串或 JSON 文件类对象。
In [10]: import pandas as pd
In [11]: df = pd.read_json(response.text)
In [12]: df
Out[12]:
id name
0 578149602163689207 Axel Network Test
1 578149602163688579 Your org
2 578149602163688880 Your org
3 578149602163688885 Your org
4 578149602163689038 Tory's Test Lab
【讨论】:
这个比较简单!! 这看起来不错,但是当我添加第 3 行“df = pd.read_json(json.dumps(response.text))”时出现大量错误。见这里:pastebin.com/1cNbDwyc 这些错误很可能是由于 JSON 格式错误。你能分享json.dumps(response.text)
的 pastebin 吗?请分享完整的输出。
@amanb 当然。这是 print(json.dumps(response.text)) pastebin.com/VR1SAciM 的输出
@user9940344,@amanb 响应已经序列化了为什么还要序列化!!,可以直接发出:df=pd.read_json(response.text)【参考方案2】:
收到响应后,您缺少反序列化对 python 对象的 json 响应,正如@ASHu2 提到的那样
import pandas as pd
import json
data = json.loads(response.text)
df= pd.DataFrame(data=data, columns=["id","name"])
#Optional define index
df.set_index('id', inplace=True)
【讨论】:
是的,这是必须的!!不错【参考方案3】:试试这个:
df = pd.DataFrame.from_dict(response.json())
而不是这个:
df = pd.DataFrame(response, columns=['id', 'name'])
【讨论】:
我认为这可行,但我得到了两个额外的列?我得到 id、name 和其他 2 列“samlConsumerUrl | samlConsumerUrls”。顺便说一下,您能否简要介绍一下您的解决方案为何有效? 添加此步骤以删除额外的列 df=df[['id','name']]response.json()
返回一个 python 字典,我使用 from_dict
方法将该字典读入数据帧。我看到id 537758
有samlConsumerUrl | samlConsumerUrls
键,这就是它们的来源。我不是专家,所以很遗憾,我无法真正深入了解一切是如何运作的。【参考方案4】:
由于响应文本位于json
,您可以:
1.将json转成dict。
2. 将字典作为数据框提供。
#load the json as a dict
data = json.loads(response.text)
df = pd.DataFrame.from_dict(data, orient='index')
df.reset_index(level=0, inplace=True)
然后您可以更改列的名称或其他任何内容。
【讨论】:
在顶部添加import json
@amanb 修复了 json 行,但代码的第二部分仍然出现以下错误:pastebin.com/xsRKM0R9 有什么想法吗?
尝试使用df = pd.DataFrame.from_dict(data.values(), orient='index')
以上是关于如何将python中的类转换为pandas数据框?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 pandas 数据框列转换为本机 python 数据类型?
如何在python中使用pandas将字典列表转换为数据框[重复]