我有一个json数据是这样 struct 的,我想把它变成一个数据帧:

{
    "data": {
        "1": {
            "Conversion": {
                "id": "1",
                "datetime": "2024-03-26 08:30:00"
            }
        },        
        "50": {
            "Conversion": {
                "id": "50",
                "datetime": "2024-03-27 09:00:00"
            }
        }
    }
}

我通常的方法是使用json_normalize,如下所示:

df = pd.json_normalize(input['data'])

我的目标是拥有一个只包含"id"和"datetime"列的表/rame.

如何跳过数据下方的编号级别,直接进入转换?我会想象这样的事情(这显然不起作用):

df = pd.json_normalize(input['data'][*]['Conversion'])

实现这一点的最佳方法是什么?任何提示都非常感谢!

推荐答案

您必须手动更改双列表理解中的数据:

L = [b['Conversion'] for k, v in input['data'].items() for a, b in v.items()]
print (L)
[{'id': '1', 'datetime': '2024-03-26 08:30:00'}, 
 {'id': '50', 'datetime': '2024-03-27 09:00:00'}]


out = pd.json_normalize(L)
print (out)
   id             datetime
0   1  2024-03-26 08:30:00
1  50  2024-03-27 09:00:00

这里是json_normalize不必要的,工作DataFrame构造函数:

out = pd.DataFrame(L)
print (out)
   id             datetime
0   1  2024-03-26 08:30:00
1  50  2024-03-27 09:00:00

谢谢你chepner的另一个 idea 与.values:

out = pd.json_normalize((b['Conversion'] for v in input['data'].values() 
                                         for b in v.values()))
print (out)
   id             datetime
0   1  2024-03-26 08:30:00
1  50  2024-03-27 09:00:00

out = pd.DataFrame((b['Conversion'] for v in input['data'].values() 
                                    for b in v.values()))
print (out)
   id             datetime
0   1  2024-03-26 08:30:00
1  50  2024-03-27 09:00:00

json_normalize中是参数max_level,但工作方式不同:

要归一化的最大级别数(dict的深度).如果为无,则将所有级别正常化.

out = pd.json_normalize(input['data'], max_level=1)
print (out)
                                              data.1  \
0  {'Conversion': {'id': '1', 'datetime': '2024-0...   

                                             data.50  
0  {'Conversion': {'id': '50', 'datetime': '2024-...  
                   
out = pd.json_normalize(input['data'], max_level=2)
print (out)
                                data.1.Conversion  \
0  {'id': '1', 'datetime': '2024-03-26 08:30:00'}   

                                data.50.Conversion  
0  {'id': '50', 'datetime': '2024-03-27 09:00:00'}  

out = pd.json_normalize(input['data'], max_level=3)
print (out)
  data.1.Conversion.id data.1.Conversion.datetime data.50.Conversion.id  \
0                    1        2024-03-26 08:30:00                    50   

  data.50.Conversion.datetime  
0         2024-03-27 09:00:00  

Python相关问答推荐

如何自动抓取以下CSV

即使在可见的情况下也不相互作用

使用FASTCGI在IIS上运行Django频道

Python json.转储包含一些UTF-8字符的二元组,要么失败,要么转换它们.我希望编码字符按原样保留

沿着数组中的轴计算真实条目

为什么带有dropna=False的groupby会阻止后续的MultiIndex.dropna()工作?

不理解Value错误:在Python中使用迭代对象设置时必须具有相等的len键和值

可变参数数量的重载类型(args或kwargs)

Excel图表-使用openpyxl更改水平轴与Y轴相交的位置(Python)

如何使用根据其他值相似的列从列表中获取的中间值填充空NaN数据

将pandas Dataframe转换为3D numpy矩阵

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

Polars Group by描述扩展

如何合并具有相同元素的 torch 矩阵的行?

如何将相同组的值添加到嵌套的Pandas Maprame的倒数第二个索引级别

Pythonquests.get(Url)返回Colab中的空内容

对数据帧进行分组,并按组间等概率抽样n行

极点用特定值替换前n行

#将多条一维曲线计算成其二维数组(图像)表示

将多行数据循环到嵌套框架中的单行