gpt4 book ai didi

python - 如何使用 NaN 对列进行 json_normalize

转载 作者:行者123 更新时间:2023-12-04 13:12:19 25 4
gpt4 key购买 nike

  • 此问题特定于 pandas.DataFrame 中的数据列
  • 这个问题取决于列中的值是否为 str , dict , 或 list类型。
  • 这个问题解决了如何处理 NaN值,当 df.dropna().reset_index(drop=True)不是一个有效的选择。

  • 情况1
  • 用一栏str类型,列中的值必须转换为 dict类型,带 ast.literal_eval , 使用前 .json_normalize .

  • import numpy as np
    import pandas as pd
    from ast import literal_eval

    df = pd.DataFrame({'col_str': ['{"a": "46", "b": "3", "c": "12"}', '{"b": "2", "c": "7"}', '{"c": "11"}', np.NaN]})

    col_str
    0 {"a": "46", "b": "3", "c": "12"}
    1 {"b": "2", "c": "7"}
    2 {"c": "11"}
    3 NaN

    type(df.iloc[0, 0])
    [out]: str

    df.col_str.apply(literal_eval)
    错误:
    df.col_str.apply(literal_eval) results in ValueError: malformed node or string: nan
    案例二
  • 用一栏dict类型,使用 pandas.json_normalize将键转换为列标题并将值转换为行

  • df = pd.DataFrame({'col_dict': [{"a": "46", "b": "3", "c": "12"}, {"b": "2", "c": "7"}, {"c": "11"}, np.NaN]})

    col_dict
    0 {'a': '46', 'b': '3', 'c': '12'}
    1 {'b': '2', 'c': '7'}
    2 {'c': '11'}
    3 NaN

    type(df.iloc[0, 0])
    [out]: dict

    pd.json_normalize(df.col_dict)
    错误:
    pd.json_normalize(df.col_dict) results in AttributeError: 'float' object has no attribute 'items'
    案例3
  • str 的一栏中类型,带有 dict里面list .
  • 标准化列
  • 申请 literal_eval ,因为explode对str不起作用类型
  • 炸开柱子以分隔 dicts分隔行
  • 标准化列


  • df = pd.DataFrame({'col_str': ['[{"a": "46", "b": "3", "c": "12"}, {"b": "2", "c": "7"}]', '[{"b": "2", "c": "7"}, {"c": "11"}]', np.nan]})

    col_str
    0 [{"a": "46", "b": "3", "c": "12"}, {"b": "2", "c": "7"}]
    1 [{"b": "2", "c": "7"}, {"c": "11"}]
    2 NaN

    type(df.iloc[0, 0])
    [out]: str

    df.col_str.apply(literal_eval)
    错误:
    df.col_str.apply(literal_eval) results in ValueError: malformed node or string: nan

    最佳答案

  • 始终可以选择:
  • df = df.dropna().reset_index(drop=True)
  • 这对于这里的虚拟数据很好,或者在处理其他列无关紧要的数据帧时。
  • 对于需要额外列的数据框来说,这不是一个很好的选择。


  • 情况1
  • 由于该列包含 str类型,填写 '{}' (str)

  • import numpy as np
    import pandas as pd
    from ast import literal_eval

    df = pd.DataFrame({'col_str': ['{"a": "46", "b": "3", "c": "12"}', '{"b": "2", "c": "7"}', '{"c": "11"}', np.NaN]})

    col_str
    0 {"a": "46", "b": "3", "c": "12"}
    1 {"b": "2", "c": "7"}
    2 {"c": "11"}
    3 NaN

    type(df.iloc[0, 0])
    [out]: str

    # fillna
    df.col_str = df.col_str.fillna('{}')

    # convert the column to dicts
    df.col_str = df.col_str.apply(literal_eval)

    # use json_normalize
    df = df.join(pd.json_normalize(df.col_str)).drop(columns=['col_str'])

    # display(df)
    a b c
    0 46 3 12
    1 NaN 2 7
    2 NaN NaN 11
    3 NaN NaN NaN
    案例二
  • 由于该列包含 dict类型,填写 {} (不是 str )
  • 这需要使用字典理解来填充,因为 fillna({})不起作用

  • df = pd.DataFrame({'col_dict': [{"a": "46", "b": "3", "c": "12"}, {"b": "2", "c": "7"}, {"c": "11"}, np.NaN]})

    col_dict
    0 {'a': '46', 'b': '3', 'c': '12'}
    1 {'b': '2', 'c': '7'}
    2 {'c': '11'}
    3 NaN

    type(df.iloc[0, 0])
    [out]: dict

    # fillna
    df.col_dict = df.col_dict.fillna({i: {} for i in df.index})

    # use json_normalize
    df = df.join(pd.json_normalize(df.col_dict)).drop(columns=['col_dict'])

    # display(df)
    a b c
    0 46 3 12
    1 NaN 2 7
    2 NaN NaN 11
    3 NaN NaN NaN
    案例3
  • 填写 NaNs'[]' (str)
  • 现在 literal_eval会工作
  • .explode可用于色谱柱分离dict行的值
  • 现在NaNs需要填写{} (不是 str )
  • 然后可以对列进行归一化
  • 对于列为 lists 的情况的 dicts ,那不是 str输入,跳至 .explode .

  • df = pd.DataFrame({'col_str': ['[{"a": "46", "b": "3", "c": "12"}, {"b": "2", "c": "7"}]', '[{"b": "2", "c": "7"}, {"c": "11"}]', np.nan]})

    col_str
    0 [{"a": "46", "b": "3", "c": "12"}, {"b": "2", "c": "7"}]
    1 [{"b": "2", "c": "7"}, {"c": "11"}]
    2 NaN

    type(df.iloc[0, 0])
    [out]: str

    # fillna
    df.col_str = df.col_str.fillna('[]')

    # literal_eval
    df.col_str = df.col_str.apply(literal_eval)

    # explode
    df = df.explode('col_str').reset_index(drop=True)

    # fillna again
    df.col_str = df.col_str.fillna({i: {} for i in df.index})

    # use json_normalize
    df = df.join(pd.json_normalize(df.col_str)).drop(columns=['col_str'])

    # display(df)
    a b c
    0 46 3 12
    1 NaN 2 7
    2 NaN 2 7
    3 NaN NaN 11
    4 NaN NaN NaN

    关于python - 如何使用 NaN 对列进行 json_normalize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63876637/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com