zendesk api以字典列表的形式返回字段,但每个列表都是一条记录.我想知道是否有更好的方法将其全部转换为数据帧.如果它是一本词典词典,那么json_normalize会毫无问题地处理它.

警告:并非所有记录都具有相同的字段ID

样本数据:

data = [{
  "ticket_id": 4,
  "customer_id": 8,
  "created_at": "2022-05-01",
  "custom_fields": [
    {
      "id": 15,
      "value": "website"
    },
    {
      "id": 16,
      "value": "broken"
    },
    {
      "id": 23,
      "value": None
    },
  ],
  'group_id': 42
}]

运行任何形式的Dataframe、from_recordsfrom_jsonjson_normalize都可以提供我想要的大部分内容,但列表只在一列中:

t_df = pd.json_normalize(data)
t_df

输出:

ticket_id customer_id created_at custom_fields group_id
0 4 8 2022-05-01 [{'id': 15, 'value': 'website'}, {'id': 16, 'v... 42

我目前的解决方案可能是不明智的:

t_df = pd.DataFrame(sample_df.at[0, 'custom_fields']).T.reset_index(drop=True)
t_df.rename(columns=t_df.iloc[0], inplace=True)
t_df.drop(0, inplace=True)
t_df.reset_index(drop=True, inplace=True)
pd.merge(left=sample_df, left_index=True,
         right=t_df, right_index=True).drop(columns='custom_fields')

这会产生一条正确的记录,我可以将其附加到主数据帧:

ticket_id customer_id created_at group_id 15 16 23
0 4 8 2022-05-01 42 website broken None

我担心的是,我需要对大约25000条记录执行此操作,而这似乎既慢又脆(容易损坏).

推荐答案

您应该首先对数据/字典进行争论,然后才用它构建一个数据框架.它将使您的生活更加轻松,比使用pandas操作数据更快,即在创建数据帧之后.

import pandas as pd

data = [{
  "ticket_id": 4,
  "customer_id": 8,
  "created_at": "2022-05-01",
  "custom_fields": [
    {
      "id": 15,
      "value": "website"
    },
    {
      "id": 16,
      "value": "broken"
    },
    {
      "id": 23,
      "value": None
    },
  ],
  'group_id': 42
}]

custom_fields = data[0].pop('custom_fields')
data[0].update({rec['id']: rec['value'] for rec in custom_fields})

t_df = pd.DataFrame(data)

输出:

>>> t_df 

   ticket_id  customer_id  created_at  group_id       15      16    23
0          4            8  2022-05-01        42  website  broken  None

Python相关问答推荐

将列中的滚动值集转换为单元格中的单个值

如何输入提示抽象方法属性并让mypy高兴?

修剪Python框架中的尾随NaN值

Python(Polars):使用之前的变量确定当前解决方案的Vector化操作

单击cookie按钮,但结果不一致

如何在超时的情况下同步运行Matplolib服务器端?该过程随机挂起

在Arrow上迭代的快速方法.Julia中包含3000万行和25列的表

通过仅导入pandas来在for循环中进行多情节

Python:在类对象内的字典中更改所有键的索引,而不是仅更改一个键

我在使用fill_between()将最大和最小带应用到我的图表中时遇到问题

如何标记Spacy中不包含特定符号的单词?

如何在Windows上用Python提取名称中带有逗号的文件?

更改键盘按钮进入'

基于字符串匹配条件合并两个帧

ODE集成中如何终止solve_ivp的无限运行

将tdqm与cx.Oracle查询集成

SQLAlchemy Like ALL ORM analog

如何更新pandas DataFrame上列标题的de值?

如何在Python中获取`Genericums`超级类型?

未调用自定义JSON编码器