Как разбить / вставить вложенный словарь внутри списка, внутри pandas кадра данных? - PullRequest
1 голос
/ 26 марта 2020

У меня есть фрейм данных, в котором есть словарь внутри вложенного списка, и я хочу разделить столбец '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

Ответы [ 3 ]

1 голос
/ 26 марта 2020

Код

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]})

Выход :

enter image description here

1 голос
/ 26 марта 2020

Из комментариев json_normalize может помочь вам.

После извлечения столбцов id и col с:

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

Вы можете взорваться словарь в Col с json_normalize и использовать 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
1 голос
/ 26 марта 2020

Вы можете попробовать .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'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...