RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1586726
Accepted
Angelina
Angelina
Asked:2024-07-10 19:06:18 +0000 UTC2024-07-10 19:06:18 +0000 UTC 2024-07-10 19:06:18 +0000 UTC

如何解析 pandas 中的 json 列?

  • 772

数据框有一列包含以下行:{\'name\': {\'ty​​pe\': \'STRING\', \'value\': \'test\'}, \'company\': {\ ' 类型\':\'字符串\',\'值\':\'Roga Kopyta LLC\'},\'角色\':{\'类型\':\'字符串\',\'值\' : \'用户\'}}

我试图将每个自定义参数解析为单独的列,获取自定义参数列的名称并用 value 中的值填充它。

我的代码:

temp_table = pd.json_normalize(data.custom)
list_col = [x for x in temp_table.columns if x.split('.')[1] == 'type']
temp_table = temp_table.drop(columns=list_col)
temp_table.columns = [x.split('.')[0] for x in temp_table.columns]
data = data[['col1', 'col2']].join(temp_table)

问题是当pd.json_normalize(data.custom)我返回一个空表时。我的假设是问题出在单引号中,我尝试替换它们:

data.custom=data.custom.apply(lambda x: x.replace("'", '"'))
data.custom=data.custom.str.replace('"', '\\\"', regex=True)

没有帮助。我尝试匹配这样的行:

data.custom=data.custom.apply(lambda x: json.loads(json.dumps(x)))

也没有帮助。现在我相信我没有正确确定原因。也许整个问题出在我的代码中。

json
  • 2 2 个回答
  • 48 Views

2 个回答

  • Voted
  1. Best Answer
    Алексей Р
    2024-07-10T21:03:10Z2024-07-10T21:03:10Z

    代码中的注释

    import ast  # импортируем библиотеку ast для безопасного преобразования текста в словарь
    
    df = pd.DataFrame({'Код': [1001, 1003, 1005],
                       'custom': ["""{'name': {'type': 'STRING', 'value': 'test'}, 'company': {'type': 'STRING', 'value': 'ООО "Рога копыта"'}, 'role': {'type': 'STRING', 'value': 'пользователь'}}""",
                                  """{'name': {'type': 'STRING', 'value': 'Вася'}, 'company': {'type': 'STRING', 'value': 'ООО "Ромашка"'}, 'role': {'type': 'STRING', 'value': 'админ'}}""",
                                  """{'name': {'type': 'STRING', 'value': 'Петя'}, 'company': {'type': 'STRING', 'value': 'ООО "Ронин"'}, 'role': {'type': 'STRING', 'value': 'продавец'}}"""]})
    
    df.custom = df.custom.transform(ast.literal_eval)  # преобразуем текст в словари в каждой ячейке столбца custom
    fields = list(set(df.custom.transform(list).sum()))  # из этого же столбца вытаскиваем множество ключей - они станут названиями столбцов
    df[fields] = df['custom'].apply(lambda x: pd.Series({k: x[k]['value'] for k in x}))  # разбираем словари на столбцы
    df = df.drop(columns='custom')  # удаляем исходный столбец custom, если он уже не нужен
    print(df)
    
        Код  name            company          role
    0  1001  test  ООО "Рога копыта"  пользователь
    1  1003  Вася      ООО "Ромашка"         админ
    2  1005  Петя        ООО "Ронин"      продавец
    

    另一种方法是创建一个字典列表,然后通过一次操作将其转换为框架。我在 810k 线路上测试了它,它在 33 秒内运行。

    import ast  # импортируем библиотеку ast для безопасного преобразования текста в словарь
    import time
    start = time.time()
    mul = 270_000 #000
    df = pd.DataFrame({'Код': [1001, 1003, 1005] * mul,
                       'custom': ["""{'name': {'type': 'STRING', 'value': 'test'}, 'company': {'type': 'STRING', 'value': 'ООО "Рога копыта"'}, 'role': {'type': 'STRING', 'value': 'пользователь'}}""",
                                  """{'name1': {'type': 'STRING', 'value': 'Вася'}, 'company1': {'type': 'STRING', 'value': 'ООО "Ромашка"'}, 'role1': {'type': 'STRING', 'value': 'админ'}}""",
                                  """{'name2': {'type': 'STRING', 'value': 'Петя'}, 'company2': {'type': 'STRING', 'value': 'ООО "Ронин"'}, 'role2': {'type': 'STRING', 'value': 'продавец'}}"""] * mul})
    
    lst = []
    dicts = df.custom.transform(ast.literal_eval)  # преобразуем текст в словари в каждой ячейке столбца custom
    dicts.apply(lambda x: lst.append({k: x[k]['value'] for k in x}))
    df = pd.DataFrame(lst)
    print(df.head())
    print((time.time()-start), 'сек.')
    
       name            company          role name1       company1  role1 name2     company2     role2
    0  test  ООО "Рога копыта"  пользователь   NaN            NaN    NaN   NaN          NaN       NaN
    1   NaN                NaN           NaN  Вася  ООО "Ромашка"  админ   NaN          NaN       NaN
    2   NaN                NaN           NaN   NaN            NaN    NaN  Петя  ООО "Ронин"  продавец
    3  test  ООО "Рога копыта"  пользователь   NaN            NaN    NaN   NaN          NaN       NaN
    4   NaN                NaN           NaN  Вася  ООО "Ромашка"  админ   NaN          NaN       NaN
    32.78659248352051 сек.
    

    一行相同(方法链):

    df = pd.DataFrame(df.custom.transform(ast.literal_eval).apply(lambda x: {k: x[k]['value'] for k in x}).to_list())  # преобразуем текст в словари в каждой ячейке столбца custom, переводим в список словарей и создаем новый фрейм
    
    • 1
  2. Oopss
    2024-07-10T19:58:52Z2024-07-10T19:58:52Z
    import pandas as pd
    import json
    
    
    your_dict = {'name': {'type': 'STRING', 'value': 'test'},
     'company': {'type': 'STRING', 'value': 'ООО "Рога копыта"'},
      'role': {'type': 'STRING', 'value': 'пользователь'}}
    
    #Словарь в json
    your_json_string=json.dumps(your_dict)
    
    #JSON  d JSON объект
    data = json.loads(your_json_string)
    
    #Датафрейм
    df = pd.DataFrame(data)
    
    print(df)
    

             name            company          role
    type   STRING             STRING        STRING
    value    test  ООО "Рога копыта"  пользователь
    
    • 0

相关问题

  • Powershell 和 JSON 对象字段

  • 正确形成 json-string kotlin

  • 创建 JSON,其中键是增量值

  • 如何在反应中正确实现负载更多

  • 在 Mac 操作系统上打开大型 JSON 文件?

  • 循环通过 QJsonArray

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5