Python Pandas: Как создать столбцы из вложенного словаря - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь отфильтровать свой фрейм данных, создавая отдельные столбцы для повышения удобочитаемости и удобства использования.

Постановка задачи: столбец «Editables» содержит вложенный словарь в качестве значения, которое я пытаюсь создать в виде столбца в соответствии с ключом. Например, «photo_repace» «text_remove», «text_add» имеет разные столбцы.

Вложенный словарь:

{
'photo': {
    'photo_replace': None,
    'photo_remove': None,
    'photo_add': None,
    'photo_effect': None,
    'photo_brightness': None,
    'background_color': None,
    'photo_resize': None,
    'photo_rotate': None,
    'photo_mirror': None,
    'photo_layer_rearrange': None,
    'photo_move': None
},
'text': {
    'text_remove': None,
    'text_add': None,
    'text_edit': None,
    'font_select': None,
    'text_color': None,
    'text_style': None,
    'background_color': None,
    'text_align': None,
    'text_resize': None,
    'text_rotate': None,
    'text_move': None,
    'text_layer_rearrange': None
}
}

Вывод

enter image description here

Код, который я использовал:

df["editables"] = df["editables"].apply(lambda x : dict(eval(x)))
df_edit = df["editables"].apply(pd.Series )

Выход: enter image description here

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

Попробуйте:

>>> dct = {
'photo': {
    'photo_replace': None,
    'photo_remove': None,
    'photo_add': None,
    'photo_effect': None,
    'photo_brightness': None,
    'background_color': None,
    'photo_resize': None,
    'photo_rotate': None,
    'photo_mirror': None,
    'photo_layer_rearrange': None,
    'photo_move': None
},
'text': {
    'text_remove': None,
    'text_add': None,
    'text_edit': None,
    'font_select': None,
    'text_color': None,
    'text_style': None,
    'background_color': None,
    'text_align': None,
    'text_resize': None,
    'text_rotate': None,
    'text_move': None,
    'text_layer_rearrange': None
}
}
>>> pd.DataFrame(dct).T
       photo_replace  photo_remove  ...  text_move  text_layer_rearrange
photo            NaN           NaN  ...        NaN                   NaN
text             NaN           NaN  ...        NaN                   NaN

[2 rows x 22 columns]
>>> pd.DataFrame(dct).T[['photo_replace', 'photo_remove', 'text_remove']]
       photo_replace  photo_remove  text_remove
photo            NaN           NaN          NaN
text             NaN           NaN          NaN

ПРИМЕЧАНИЕ: .T транспонирует кадр данных.

1 голос
/ 19 февраля 2020

Используйте json.json_normalize для строк и concat, последние значения удаления перед первым . в именах столбцов:

from pandas.io.json import json_normalize

c = ['photo.photo_replace', 'photo.photo_remove', 'text.text_remove']
df = pd.concat([json_normalize(x)[c] for x in df['editables']], ignore_index=True)
df.columns = df.columns.str.split('.').str[1]
print (df)
  photo_replace photo_remove text_remove
0          None         None        None
1          None         None        None
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...