如何使用json_normalize将嵌套的Json数据扁平化

3

我正在尝试通过json_normalize将JSON数据导入Dataframe,但无法使其工作。

我的数据:

a键与c1键相同。

[
  {
    "a": "A1",
    "b": "B1",
    "c": [
      {
        "c1": "C111",
        "c2": "C121",
        "c3": ["C1131","C1132"]
      }
    ]
  },
  {
    "a": "A2",
    "b": "B2",
    "c": [
      {
        "c1": "C211",
        "c2": "C212",
        "c3": ["C2131","C2132"]
      },
      {
        "c1": "C221",
        "c2": "C222",
        "c3": ["C2231"]
      }
    ]
  }
]

我想创建一个类似DataFrame的数据结构。
           a     c1(a)      c2                    c3
0         A1      C111    C121     ["C1131","C1132"]
1         A2      C211    C212     ["C2131","C2132"]
2         A2      C221    C222             ["C2231"]

当我使用json_normalize时,它显示“ValueError”错误:
entity_df = json_normalize(data, 'c', 'a')

ValueError: Conflicting metadata name a, need distinguishing prefix 

我该如何更改json_normalize的参数? 感谢您的帮助。

3个回答

1
你可以尝试:

from collections import defaultdict

norm_data = defaultdict(list)
for item in data:
    for element in item['c']:
        norm_data['a'].append(item['a'])
        for k, v in element.items():
            if k in {'a', 'c1'}:
                norm_data['c1(a)'].append(v)
            else:
                norm_data[k].append(v)

pd.DataFrame(norm_data)

enter image description here


1
如果您已经经历了隐藏真实数据的痛苦,请确保制作与真实数据具有相同特征的虚拟数据。
假设您有以下JSON:
json_data =\
[{'a': 'A1',
  'b': 'B1',
  'c': [{'a': 'C111', 'c2': 'C121', 'c3': ['C1131', 'C1132']}]},
 {'a': 'A2',
  'b': 'B2',
  'c': [{'a': 'C211', 'c2': 'C212', 'c3': ['C2131', 'C2132']},
   {'a': 'C221', 'c2': 'C222', 'c3': ['C2231']}]}]

您只需要一行代码来提取它:

您只需要一行代码来提取它:

pd.json_normalize(json_data, 'c', ['a', 'b'], record_prefix='data.')

结果:

  data.a data.c2         data.c3   a   b
0   C111    C121  [C1131, C1132]  A1  B1
1   C211    C212  [C2131, C2132]  A2  B2
2   C221    C222         [C2231]  A2  B2

"

record_prefix='data.' 是指出现了 ValueError: Conflicting metadata name a, need distinguishing prefix 错误信息。

"

0
data = [
  {
    "a": "A1",
    "b": "B1",
    "c": [
      {
        "c1": "C111",
        "c2": "C121",
        "c3": ["C1131","C1132"]
      }
    ]
  },
  {
    "a": "A2",
    "b": "B2",
    "c": [
      {
        "c1": "C211",
        "c2": "C212",
        "c3": ["C2131","C2132"]
      },
      {
        "c1": "C221",
        "c2": "C222",
        "c3": ["C2231"]
      }
    ]
  }
]
pd.io.json.json_normalize(data,"c", ['a', 'b',])

输出:

    c1      c2      c3              a   b
0   C111    C121    [C1131, C1132]  A1  B1
1   C211    C212    [C2131, C2132]  A2  B2
2   C221    C222    [C2231]         A2  B2

仍然存在“元数据名称冲突a,需要区分前缀”,'c1'和'a'是相同的字符串,我应该如何添加前缀? - moussesj94
1
谢谢你的帮助,我终于通过添加 record_prefix='_' 得到了解决方案。 - moussesj94
1
它对我来说运行良好,你确定你已经包含了所有细节或者有什么东西出错了吗? - adnanmuttaleb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接