使用 pd.json_normalize 展平字典

2023-12-15

我目前正在努力压平这个字典文件,并且已经遇到了一些障碍。我正在尝试使用json_normalize来扁平化这些数据。如果我用单个实例进行测试,它可以工作,但如果我想展平所有数据,它将返回一个错误,说明key error '0'我不知道如何解决这个问题。

数据示例-

data = {1:{
      'Name': "Thrilling Tales of Dragon Slayers",
      'IDs':{
            "StoreID": ['123445452543'],
            "BookID": ['543533254353'],
            "SalesID": ['543267765345']},
     2:{
      'Name': "boring Tales of Dragon Slayers",
      'IDs':{
            "StoreID": ['111111', '1121111'],
            "BookID": ['543533254353', '4324232342'],
            "SalesID": ['543267765345', '4353543']}}

my code

d_flat = pd.io.json.json_normalize(data, meta=['Title', 'StoreID', 'BookID', 'SalesID'])

Setup

您的数据结构不方便。我想重点关注:

  1. 获取列表'IDs'放入字典列表中,这会方便得多。
  2. 摆脱父字典中无用的键。我们关心的只是价值观。

Your data:

{1: {'Name': 'Thrilling Tales of Dragon Slayers',
     'IDs': {'StoreID': ['123445452543'],
             'BookID': ['543533254353'],
             'SalesID': ['543267765345']}},
 2: {'Name': 'boring Tales of Dragon Slayers',
     'IDs': {'StoreID': ['111111', '1121111'],
             'BookID': ['543533254353', '4324232342'],
             'SalesID': ['543267765345', '4353543']}}}

我希望它看起来像什么:

[{'Name': 'Thrilling Tales of Dragon Slayers',
  'IDs': [{'StoreID': '123445452543',
           'BookID': '543533254353',
           'SalesID': '543267765345'}]},
 {'Name': 'boring Tales of Dragon Slayers',
  'IDs': [{'StoreID': '111111',
           'BookID': '543533254353',
           'SalesID': '543267765345'},
          {'StoreID': '1121111',
           'BookID': '4324232342',
           'SalesID': '4353543'}]}]

重组数据

合理的方式

简单的循环,不要搞乱。这得到了我上面展示的内容

new = []

for v in data.values():
    temp = {**v}           # This is intended to keep all the other data that might be there
    ids = temp.pop('IDs')  # I have to focus on this to create the records
    temp['IDs'] = [dict(zip(ids, x)) for x in zip(*ids.values())]
    new.append(temp)

可爱的单线

new = [{**v, 'IDs': [dict(zip(v['IDs'], x)) for x in zip(*v['IDs'].values())]} for v in data.values()]

Create DataFrame with pd.json_normalize

在这次通话中json_normalize我们需要指定记录的路径,即在'IDs' key. json_normalize将为该列表中的每个项目在数据框中创建一行。这将通过record_path参数,我们传递一个tuple描述路径(如果它在更深的结构中)或字符串(如果键位于顶层,对我们来说,它是)。

record_path = 'IDs'

然后我们想告诉json_normalize什么键是记录的元数据。如果像我们一样有多个记录,则每条记录都会重复元数据。

meta = 'Name'

所以最终的解决方案如下所示:

pd.json_normalize(new, record_path='IDs', meta='Name')

        StoreID        BookID       SalesID                               Name
0  123445452543  543533254353  543267765345  Thrilling Tales of Dragon Slayers
1        111111  543533254353  543267765345     boring Tales of Dragon Slayers
2       1121111    4324232342       4353543     boring Tales of Dragon Slayers

However

如果我们无论如何都要进行重组,不妨将其传递给数据帧构造函数。

pd.DataFrame([
    {'Name': r['Name'], **dict(zip(r['IDs'], x))}
    for r in data.values() for x in zip(*r['IDs'].values())
])

                                Name       StoreID        BookID       SalesID
0  Thrilling Tales of Dragon Slayers  123445452543  543533254353  543267765345
1     boring Tales of Dragon Slayers        111111  543533254353  543267765345
2     boring Tales of Dragon Slayers       1121111    4324232342       4353543

奖励内容

当我们这样做的时候。关于每个 id 类型是否具有相同数量的 id,数据不明确。假设他们没有。

data = {1:{
      'Name': "Thrilling Tales of Dragon Slayers",
      'IDs':{
            "StoreID": ['123445452543'],
            "BookID": ['543533254353'],
            "SalesID": ['543267765345']}},
     2:{
      'Name': "boring Tales of Dragon Slayers",
      'IDs':{
            "StoreID": ['111111', '1121111'],
            "BookID": ['543533254353', '4324232342'],
            "SalesID": ['543267765345', '4353543', 'extra id']}}}

然后我们可以使用zip_longest from itertools

from itertools import zip_longest

pd.DataFrame([
    {'Name': r['Name'], **dict(zip(r['IDs'], x))}
    for r in data.values() for x in zip_longest(*r['IDs'].values())
])

                                Name       StoreID        BookID       SalesID
0  Thrilling Tales of Dragon Slayers  123445452543  543533254353  543267765345
1     boring Tales of Dragon Slayers        111111  543533254353  543267765345
2     boring Tales of Dragon Slayers       1121111    4324232342       4353543
3     boring Tales of Dragon Slayers          None          None      extra id
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 pd.json_normalize 展平字典 的相关文章

随机推荐

  • Java连接多个数据库

    我正在创建一个连接到多个数据库的java应用程序 用户将能够从下拉框中选择他们想要连接的数据库 然后 程序通过将名称传递给创建初始上下文的方法来连接到数据库 以便它可以与 Oracle Web 逻辑数据源进行通信 public class
  • 编辑预定的待处理意向

    我编写了一个应用程序 可以在之前选择的预定时间打开 关闭 WiFi 它的工作方式非常简单 从时间选择器中选择时间 然后添加它 它以编程方式从时间选择器获取数据并设置和警报 我首先写下我的活动和广播接收器的代码 在这段代码下面我将写下我的问题
  • instanceof 抛出不兼容的类型

    我最近在以下代码片段中遇到了一个奇怪的编译错误 class A class B extends A class Example class Demo public static void main String args B b new B
  • android gridview 行分隔符/分隔符

    有没有办法在网格视图中的行之间显示 水平 分隔线 我尝试在每个网格项目下方放置一个小分隔符图像 但这不是解决方案 因为当一行未完全填充项目时 它不会跨越整行 有没有办法在每一行之间添加图像 我只能找到改变行间距的方法 如果您使用网格项目的自
  • 格式指定类型“unsigned Short”,但参数类型为“int”

    我有一个扫描字符串的方法 将任何新行转换为 br 对于 HTML 有问题的行是 NSCharacterSet newLineCharacters NSCharacterSet characterSetWithCharactersInStri
  • 如果是负数则删除行

    如果我的 data frame 看起来像 A B C 1 10 James Math 2 1 Tony Science 3 5 Kevin Math 4 11 Chris Math 5 13 Min English 我想删除行 如果A有一个
  • 如何自动化使用 Web 服务的任务

    我有一个winform应用程序需要消耗一个网络服务 Web 服务检查数据库中是否有任何更改 如果数据库中有任何更改 则应通知 winform 应用程序并相应地执行一些任务 我怎么做 我想在我的 winform 应用程序中使用计时器 然后每隔
  • 将 HTML 字符串转换为图像

    我有一个保存 HTML 标记的字符串变量 该 HTML 标记基本上代表了电子邮件内容 现在我想根据该字符串内容创建一个图像 该图像实际上包含 HTML 标记 我不想通过将此内容写入其中来创建 HTML 文件 我只想使用这个字符串创建一个图像
  • CHtmlView Navigate2 和 ExecWB 执行

    这是链接到我之前的问题 我已经成功地从CHtmlView对于我的应用程序生成的报告的新型视图 但我在新视图中发现了一些问题 class CMyHtmlView public CHtmlView protected create from s
  • async/await 总是返回承诺

    我正在尝试异步 等待功能 我有这样的代码模仿请求 const getJSON async gt const request gt new Promise resolve reject gt setTimeout gt resolve foo
  • 如果派生类继承基类的私有成员,那么为什么不继承构造函数呢?

    我想澄清我对 C 中这个基本 OOPS 概念的理解 在大多数互联网网站上 我读到派生类inherits基类的私有成员 但它无法访问那些成员 派生类可以访问 public protected internal 和 基类的受保护内部成员 即使派
  • 使用 AlertDialog.Builder 时防止显示 StatusBar

    In the XML of my MainActivity 我已经对其进行了编程 以便it uses一个主题与NoActionBar因此没有显示操作栏 然而 每当我想显示一个对话框时 我都会调用我的一个DialogFragments使用一个
  • 如何比较 SKSpriteNode 纹理

    我正在使用 Sprite Kit 制作游戏 当发生碰撞时 我想检索与我的射弹碰撞的 SKSpriteNode 的图像 以根据怪物的图像分配不同的点值 我认为比较 SKSpriteNode 的纹理属性是可行的 我尝试过以下代码 但我的 if
  • Laravel 5 - 从用户的所有设备中注销用户

    一个用户已登录 并且他也已经在 3 台不同的计算机上登录 现在用户更改了密码 我想做点什么让他从所有设备上注销 默认情况下 如果我们在一台设备上更改密码 其他设备上不会发生任何情况 首先想到的是在中间件 每个请求 中检查密码 这不好并且会显
  • Android 日历特定事件删除

    我创建了一个应用程序 可以轻松地将我想要的值放入设备的日历中 但是当我想以编程方式从日历中删除它时 我找不到方法 我在网上搜索过 主要是其他 stackoverflow 问题 以找到答案 此处链接 删除日历条目 日历中的事件未删除 删除特定
  • 透明前景

    我想添加一个半透明的均匀层作为前景div元素 最好的方法是什么 你可以使用这个CSS div parent position relative this div is a descendent of the div above div ch
  • Android:带背景的透明彩色ListView

    I have a doubt I have a listview and below it there is a background with a image I would like to have the lists with a t
  • 执行长进程时,Windows 窗体中的动画 GIF

    我用 C 开发了一个简单的 Windows 应用程序 MDI 它将数据从 SQL 导出到 Excel 我正在使用 ClosedXML 成功实现这一目标 当该过程执行时 我想显示一个包含动画 GIF 图像的图片框 我是初学者 不知道如何实现这
  • 如何在Android中的mapView上使用kml文件

    我想知道如何以编程方式将已创建的 kml 文件加载到地图视图中 kml 文件存储在 SD 卡中 我已经设置了一个mapActivity 我是否只是 SAX 解析 kml 文件并使用绘制方法来创建边界 这是存储在手机上的 kml 文件的片段
  • 使用 pd.json_normalize 展平字典

    我目前正在努力压平这个字典文件 并且已经遇到了一些障碍 我正在尝试使用json normalize来扁平化这些数据 如果我用单个实例进行测试 它可以工作 但如果我想展平所有数据 它将返回一个错误 说明key error 0 我不知道如何解决