【问题标题】:Normalize JSON API data to columns将 JSON API 数据标准化为列
【发布时间】:2023-04-03 07:58:01
【问题描述】:

我正在尝试从我们的 Hubspot CRM 数据库中获取数据,并使用 pandas 将其转换为数据框。我仍然是 python 的初学者,但我无法让 json_normalize 工作。

数据库的输出是我这样的JSON格式:

{'archived': False,
 'archived_at': None,
 'associations': None,
 'created_at': datetime.datetime(2019, 12, 21, 17, 56, 24, 739000, tzinfo=tzutc()),
 'id': 'xxx',
 'properties': {'createdate': '2019-12-21T17:56:24.739Z',
                'email': 'xxxxx@xxxxx.com',
                'firstname': 'John',
                'hs_object_id': 'xxx',
                'lastmodifieddate': '2020-04-22T04:37:40.274Z',
                'lastname': 'Hansen'},
 'updated_at': datetime.datetime(2020, 4, 22, 4, 37, 40, 274000, tzinfo=tzutc())}, {'archived': False,
 'archived_at': None,
 'associations': None,
 'created_at': datetime.datetime(2019, 12, 21, 17, 52, 38, 485000, tzinfo=tzutc()),
 'id': 'bbb',
 'properties': {'createdate': '2019-12-21T17:52:38.485Z',
                'email': 'bbb@bbb.dk',
                'firstname': 'John2',
                'hs_object_id': 'bbb',
                'lastmodifieddate': '2020-05-19T07:18:28.384Z',
                'lastname': 'Hansen2'},
 'updated_at': datetime.datetime(2020, 5, 19, 7, 18, 28, 384000, tzinfo=tzutc())}, {'archived': False,
 'archived_at': None,
 'associations': None,

等等。 尝试使用此代码将其放入数据框中:

import hubspot
import pandas as pd
import json
from pandas.io.json import json_normalize
import os

client = hubspot.Client.create(api_key='################')

all_contacts = contacts_client = client.crm.contacts.get_all()

df=pd.io.json.json_normalize(all_contacts,'properties')
df.head

df.to_csv ('All contacts.csv')

但我不断收到无法解决的错误。

我也试过了

pd.dataframe(all_contacts)

pf.dataframe.from_dict(all_contacts)

【问题讨论】:

  • 你得到什么错误?您想要的数据框格式是什么?
  • 哦,当然。我想按“属性”标签电子邮件、名字、hs_object_id、姓氏 xxxxx@xxxxx.com、约翰、xxx、汉森等所有联系人的列获取数据框。我有大约 2,500 我得到的错误是“AttributeError:'SimplePublicObject'对象没有属性'values'”
  • 数据库的输出是否与您粘贴的完全一致?看起来它应该包含在一个元组中,因为您有多个元素具有相同的“键”值但不同的数据(例如存档”或“存档_at”)。
  • 是的,它是数据库的准确输出,只是匿名化的,有 2500 个数据点。有什么想法可以根据属性字段将其转换为列吗?
  • 我想我有一个解决方案,但在我发布之前(一个可能没有帮助的答案),你能告诉我print(type(all_contacts)) 返回什么吗?

标签: python json pandas hubspot


【解决方案1】:

all_contacts 变量是类似字典的元素的列表。因此,为了创建数据框,我使用列表理解来创建一个元组,该元组仅包含每个类似字典的元素的“属性”。

import datetime
import pandas as pd
from dateutil.tz import tzutc

data = ({'archived': False,
         'archived_at': None,
         'associations': None,
         'created_at': datetime.datetime(2019, 12, 21, 17, 56, 24, 739000, tzinfo=tzutc()),
         'id': 'xxx',
         'properties': {'createdate': '2019-12-21T17:56:24.739Z',
                        'email': 'xxxxx@xxxxx.com',
                        'firstname': 'John',
                        'hs_object_id': 'xxx',
                        'lastmodifieddate': '2020-04-22T04:37:40.274Z',
                        'lastname': 'Hansen'},
         'updated_at': datetime.datetime(2020, 4, 22, 4, 37, 40, 274000, tzinfo=tzutc())},
        {'archived': False,
         'archived_at': None,
         'associations': None,
         'created_at': datetime.datetime(2019, 12, 21, 17, 52, 38, 485000, tzinfo=tzutc()),
         'id': 'bbb',
         'properties': {
             'createdate': '2019-12-21T17:52:38.485Z',
             'email': 'bbb@bbb.dk',
             'firstname': 'John2',
             'hs_object_id': 'bbb',
             'lastmodifieddate': '2020-05-19T07:18:28.384Z',
             'lastname': 'Hansen2'},
         'updated_at': datetime.datetime(2020, 5, 19, 7, 18, 28, 384000, tzinfo=tzutc())})
df = pd.DataFrame([row['properties'] for row in data])
print(df)

输出:

                 createdate            email  ...          lastmodifieddate lastname
0  2019-12-21T17:56:24.739Z  xxxxx@xxxxx.com  ...  2020-04-22T04:37:40.274Z   Hansen
1  2019-12-21T17:52:38.485Z       bbb@bbb.dk  ...  2020-05-19T07:18:28.384Z  Hansen2

[2 rows x 6 columns]

【讨论】:

    猜你喜欢
    • 2021-05-28
    • 1970-01-01
    • 2021-06-20
    • 2022-01-24
    • 2021-07-20
    • 2013-06-25
    • 2016-02-04
    • 1970-01-01
    • 2019-07-27
    相关资源
    最近更新 更多