如何将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 537758samlConsumerUrl | 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数据框?的主要内容,如果未能解决你的问题,请参考以下文章

将 json 转换为 Pandas 数据框

如何将字节数据转换为 python pandas 数据框?

如何将 pandas 数据框列转换为本机 python 数据类型?

如何在python中使用pandas将字典列表转换为数据框[重复]

使用 Pandas 将数据框中的 Python 对象列转换为没有日期的时间

如何将带有元组键的 python 字典转换为 pandas 多索引数据框?