DataFrame - значения в столбце являются словарями. Как ключи и значения к основному кадру данных? - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть это df:

d = {'name':'CompanyABCD' , 
     'office_location':[{'office_x':'lat,long','office_y':'lat,long'}] , 
     'total_employees':100}

test = pd.DataFrame(d)

, где тест показывает как:

    name          office_location                            total_employees
0   CompanyABCD   {'office_x': 'lat,long', 'office_y':...    100

Как я могу извлечь информацию, чтобы кадр данных выглядел так:

    name          office_location                            total_employees  OfficeName  LatLong 
0   CompanyABCD   {'office_x': 'lat,long', 'office_y':...    100              office_x    lat,long
0   CompanyABCD   {'office_x': 'lat,long', 'office_y':...    100              office_y    lat,long

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Здесь самый простой способ состоит в том, чтобы извлечь словари в простой список словарей и построить из них вспомогательный фрейм данных и объединить его горизонтально с исходным:

aux = pd.DataFrame(test['office_location'].tolist()).stack().reset_index(level=1)

На этом этапе мы имеем:

    level_1         0
0  office_x  lat,long
0  office_y  lat,long

Время для объединения:

resul = pd.concat([test, aux.rename(columns={'level_1': 'OfficeName',
                 '0': 'LatLong'})], axis=1)

для получения:

          name                                   office_location  total_employees OfficeName         0
0  CompanyABCD  {'office_x': 'lat,long', 'office_y': 'lat,long'}              100   office_x  lat,long
0  CompanyABCD  {'office_x': 'lat,long', 'office_y': 'lat,long'}              100   office_y  lat,long

Но я думаю, что вам следует предварительно обработать данные, когда вы извлекаете их из базы данных и перед тем, как заполнить ее данным.

0 голосов
/ 17 апреля 2020

Вы можете преобразовать словарь в фрейм данных и melt его, затем объединить / присвоить фрейму данных после repeating в length из словаря:

m = pd.DataFrame(test['office_location'].tolist())
           .melt(var_name='Office',value_name='LatLong')

out = (test.loc[test.index.repeat(test['office_location'].str.len())]
      .reset_index(drop=True).assign(**m))

          name                                   office_location  \
0  CompanyABCD  {'office_x': 'lat,long', 'office_y': 'lat,long'}   
1  CompanyABCD  {'office_x': 'lat,long', 'office_y': 'lat,long'}   

   total_employees    Office   LatLong  
0              100  office_x  lat,long  
1              100  office_y  lat,long  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...