J'ai ce df:

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

test = pd.DataFrame(d)

Où le test montre comme:

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

Comment puis-je extraire les informations afin que la trame de données se traduise par ceci:

    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
0
Cateban 17 avril 2020 à 20:10

2 réponses

Meilleure réponse

Vous pouvez convertir le dictionnaire en dataframe et melt it, puis concat / assigne au dataframe après repeating au length du dictionnaire:

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  
0
anky 17 avril 2020 à 17:25

Ici, le moyen le plus simple est d'extraire les dictionnaires dans une liste simple de dictionnaires et de créer une trame de données auxiliaire à partir de celle-ci et de la concaténer horizontalement à l'original:

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

À ce stade, nous avons:

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

Temps de concaténer:

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

Obtenir:

          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

Mais je pense que vous devez prétraiter les données lorsque vous les extrayez de la base de données et avant d'alimenter le dataframe avec.

0
Serge Ballesta 17 avril 2020 à 17:30