Извлечение вложенного словаря из столбцов панд - PullRequest
2 голосов
/ 20 сентября 2019

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

мой фрейм данных:

    created_at                  selected
    2019-08-13T12:24:53+00:00   {"982813":false,"1786112":true,"3002218":false}
    2019-08-31T13:47:51+00:00   {"309279":true,"1903384":false}
        ...

И я бы хотелсоздать новый df с выбранными данными столбца в следующем формате:

        created_at                  ID            Value
        2019-08-13T12:24:53+00:00   982813        false    
        2019-08-13T12:24:53+00:00   1786112       true
        2019-08-13T12:24:53+00:00   3002218       false
        2019-08-31T13:47:51+00:00   309279        true
        2019-08-31T13:47:51+00:00   1903384       false
        ...

Я безуспешно пытался использовать explode () и json_normalize (), поэтому я решил пойти на pd.DataFrame.from_dict() и цикл for, как показано ниже, но я получаю ошибку.

x = {}
for row in df.selected:
    pd.DataFrame.from_dict(row, orient='index')

Но я получаю следующую ошибку:

AttributeError: объект 'str'не имеет атрибута «значения»

Я все еще новичок в Python, так что если кто-то, как идея / объяснение, я весь слух.

Ответы [ 3 ]

0 голосов
/ 20 сентября 2019

В вашем случае вы можете использовать explode в пандах после 0.25.0

df.BB=df.BB.map(lambda x : list(x.items()))
s=df.explode('BB')
pd.concat([s,pd.DataFrame(s.BB.tolist(),index=s.index)],axis=1)
Out[93]: 
   CC      BB  0  1
0   1  (1, 2)  1  2
0   1  (2, 1)  2  1
1   2  (2, 2)  2  2
1   2  (8, 3)  8  3
1   2  (4, 5)  4  5

Данные

df= pd.DataFrame({'CC':[1,2],'BB':[{1:2,2:1},{2:2,8:3,4:5}]})
0 голосов
/ 20 сентября 2019

Вы хотите использовать .apply(pd.Series), stack(), а затем переименовать столбцы:

df.set_index('created_at')['selected'].apply(pd.Series).stack().reset_index().rename(columns={'level_1':'ID',0:'Value'})

                  created_at       ID  Value
0  2019-08-13T12:24:53+00:00   982813  False
1  2019-08-13T12:24:53+00:00  1786112   True
2  2019-08-13T12:24:53+00:00  3002218  False
3  2019-08-31T13:47:51+00:00   309279   True
4  2019-08-31T13:47:51+00:00  1903384  False

Кстати, для дальнейшего использования вы можете получить ответы намного быстрее,предоставление кода для репликации вашей отправной точки.Большую часть времени, чтобы сделать это, я потратил на то, чтобы придумать:

df = pd.DataFrame({"created_at": ['2019-08-13T12:24:53+00:00', '2019-08-31T13:47:51+00:00'], "selected": [{"982813":False,"1786112":True,"3002218":False}, {"309279":True,"1903384":False}]})
0 голосов
/ 20 сентября 2019

Вот микро пример, чтобы показать вам идею.Не рекомендуется, если у вас большой объем:

import pandas as pd

df = pd.DataFrame([[1, {'abc':11}], [2, {'def':22, 'ghi':33}]], columns=['id', 'dct'])

lst = []

for index, row in df.iterrows():
    for key, value in row['dct'].items():
        lst.append([row['id'], key, value])


new = pd.DataFrame(lst, columns=['id', 'string', 'value'])

print(new)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...