【问题标题】:How to break/pop a nested Dictionary inside a list, inside a pandas dataframe?如何在熊猫数据框内的列表中破坏/弹出嵌套字典?
【发布时间】:2020-07-06 19:45:39
【问题描述】:

我有一个数据框,它在嵌套列表中有一个字典,我想拆分列“C”:

A B     C     
1 a    [ {"id":2,"Col":{"x":3,"y":4}}]
2 b    [ {"id":5,"Col":{"x":6,"y":7}}]

预期输出:

A B C_id Col_x Col_y
1 a  2    3     4 
2 b  5    6     7

【问题讨论】:

  • 列表中是否总是有 1 个嵌套字典?

标签: python pandas dataframe nested


【解决方案1】:

来自 cmets,json_normalize 可能会对您有所帮助。

提取idcol 列后:

df[["Col", "id"]] = df["C"].apply(lambda x: pd.Series(x[0]))

您可以使用json_normalize 分解Col 中的字典,并使用concat 与现有数据框合并:

df = pd.concat([df, json_normalize(df.Col)], axis=1)

另外,使用drop 删除旧列。

完整代码

# Import modules
import pandas as pd
from pandas.io.json import json_normalize
# from flatten_json import flatten

# Create dataframe
df = pd.DataFrame([[1, "a", [ {"id":2,"Col":{"x":3,"y":4}}]],
                   [2, "b", [ {"id":5,"Col":{"x":6,"y":7}}]]],
                   columns=["A", "B", "C"])

# Add col and id column + remove old "C" column
df = pd.concat([df, df["C"].apply(lambda x: pd.Series(x[0]))], axis=1) \
        .drop("C", axis=1)
print(df)
#    A  B               Col  id
# 0  1  a  {'x': 3, 'y': 4}   2
# 1  2  b  {'x': 6, 'y': 7}   5

# Show json_normalize behavior
print(json_normalize(df.Col))
#    x  y
# 0  3  4
# 1  6  7

# Explode dict in "col" column + remove "Col" colun
df = pd.concat([df, json_normalize(df.Col)], axis=1) \
        .drop(["Col"], axis=1)
print(df)
#    A  B  id  x  y
# 0  1  a   2  3  4
# 1  2  b   5  6  7

【讨论】:

  • 我在数据框中的第一列“A”实际上也被标记为“id”..会不会有关键错误?
  • 不,您将拥有 2 个id 列。但是,我强烈建议将第一列重命名为另一个名称。这个topic 解释了如何。
  • df["C"] 和 df['C'] 有区别吗?
  • 我不这么认为。由于这是另一个问题并且与当前主题没有联系,我建议您打开一个新的讨论以获取更多详细信息。
【解决方案2】:

代码

import pandas as pd

A = [1, 2]
B = ['a', 'b']
C = [{"id":2,"Col":{"x":3,"y":4}}, {"id":5,"Col":{"x":6,"y":7}}]
df = pd.DataFrame({"A": A, "B": B, "C_id": [element["id"] for element in C],
               "Col_x": [element["Col"]["x"] for element in C],
               "Col_y": [element["Col"]["y"] for element in C]})

输出

【讨论】:

    【解决方案3】:

    你可以试试.apply方法

    df['C_id'] = df['C'].apply(lambda x: x[0]['id'])
    df['C_x'] = df['C'].apply(lambda x: x[0]['Col']['x'])
    df['C_y'] = df['C'].apply(lambda x: x[0]['Col']['y'])
    

    【讨论】:

    • 如何循环执行此操作?因为我的 C 列实际上有很多条目
    • 重复的怎么样,是像Id还是像Col?
    • 如果您能提供数据集的快照,将会更有帮助!
    猜你喜欢
    • 1970-01-01
    • 2021-02-15
    • 2017-06-16
    • 2023-03-23
    • 2018-04-14
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多