【问题标题】:How to transform a class in python into a pandas dataframe?如何将python中的类转换为pandas数据框?
【发布时间】: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

我怎样才能实现我想要的?

【问题讨论】:

  • “产生很多错误”:你能提供完整的错误回溯吗?
  • 告诉我们什么是错误
  • 我认为您刚刚泄露了您的 API 密钥,您可能想要更改它;-)
  • @RobinNemeth 这只是教程中的一个,别担心 :)

标签: python python-3.x pandas api postman


【解决方案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')
猜你喜欢
  • 2021-10-15
  • 2014-08-19
  • 2018-05-05
  • 2020-06-17
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
相关资源
最近更新 更多