【问题标题】:How to delete part of the JSON that is corrupted in a dataframe?如何删除数据框中损坏的部分 JSON?
【发布时间】:2022-01-12 22:46:57
【问题描述】:

我有一个数据框,其中有一列的行为 json,只要删除了特定的键,我就能够正确解析它们。

   id | email     | phone no | details
-------------------------------------------------
0  10 | abc@g.com |   123   | {"a" : "hello", "b" : {"x": "whatever"....}, "c": "check"}
1  12 | xyz@g.com |   789   | {"a" : "bye", "b" : {"x": "ignore"....}, "c": "cool"}

列详细信息有一个名为“b”的键,其中包含许多键值对,其中一些已损坏,因为缺少逗号或反逗号。我不在乎它,因为我不需要它。请问我可以删除那部分 JSON 吗?

我想要如下所示:

   id | email     | phone no | details
-------------------------------------------------
0  10 | abc@g.com |   123   | {"a" : "hello", "c": "check"}
1  12 | xyz@g.com |   789   | {"a" : "bye", "c": "cool"}

我需要将详细信息中的键/值吐到“详细信息”的行和列中,如果我删除那个损坏的键,我会这样做。我有数百万条记录,因此我需要一种忽略“详细信息”列中所有行的键的方法。

谢谢。

【问题讨论】:

  • 删除它会很困难,因为您尝试匹配的任何模式都可能包含在损坏的数据中。
  • 最好先解决导致 JSON 损坏的问题。
  • 值的dtype是什么。它看起来像一个字典,但我想这是一个类似字典的字符串?
  • 感谢大家的 cmets,我们已要求修复 JSON,但源团队无法做到。实际上,这个新密钥是最近引入的,用于我们不需要使用的其他用途。它导致我现有的代码失败。
  • @Corralien - 是的,这是数据框列中的 JSON 字符串。

标签: python json pandas dataframe


【解决方案1】:

尝试使用 str.replace 的正则表达式:

PAT = re.compile(r',\s*"b"\s*:\s*{.*?}\s*,\s*')
df['details'] = df['details'].str.replace(PAT, ', ')
print(df)

# Output:
   id      email  phone no                        details
0  10  abc@g.com       123  {"a" : "hello", "c": "check"}
1  12  xyz@g.com       789     {"a" : "bye", "c": "cool"}

【讨论】:

  • @trojanhorse。你能在你的数据框上试试我的代码吗?
  • 是的,我现在正在尝试。
  • 确实如此,删除有问题的键,但我仍然看到相同的错误,因为其余键似乎仍然存在一些格式化问题。我正在调查那部分。一旦我测试了一些东西,也许我可以问你更多问题。这又是美妙的。谢谢! :)
  • 我有一个查询,而不是删除损坏的那个,你知道我怎样才能保留我想要的密钥吗?我之所以问这个问题是因为现在有多个这样的损坏的键,并且要处理这么多的正则表达式,如果我可以过滤掉我需要的那些我确定是好的 3 或 4 个键,这可能吗?
【解决方案2】:

这很恶心,但如果“b”总是包含一个字典,或者至少花括号填充了不是右花括号的东西,那么它可能会起作用:

import re
import json

# attempt to delete dictionaries associated with "b" key:
fixed = [re.sub(r'"b" ?: ?{[^}]+}, ?', '', s) for s in df['details']]

try:
    # test for valid JSON
    [json.loads(f) for f in fixed]
    df['details'] = fixed
except json.JSONDecodeError:
    print('whoops, this ugly hack failed')

【讨论】:

  • 它确实在该键的值内包含花括号和数组 - “b”
  • 在这种情况下,如果“b”部分的形式不可定义,则很难删除它。你有剩余的规格吗?例如,如果您知道“a”具有某种形式并且总是在“b”之前,“c”具有已知形式并且在“b”之后,您可以尝试反向匹配。否则这看起来很棘手。
  • 您好 AbbeGijly,该模式很独特,在这种情况下我们知道前面和后面的键,但是键/值的形式可能不同。但序列不会。
猜你喜欢
  • 2014-01-17
  • 1970-01-01
  • 2021-07-30
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多