Tengo una trama de datos pandas como esta:

    Tail Number | flight route | digit
    _______________
    001C     | (VB, MI)   | 1
             | (CC, SK)   | 2
             | (KF, KC)   | 1
    004N     | (AZ, AL)   | 2
             | (AU, NY)   | 3
    005F     | (ALB, TPA) | 5
             | (ORD, JAC) | 2

Las variables que me interesan son el número de cola, la ruta de vuelo (una tupla) y el dígito (que es una columna de valor entero).

Me gustaría hacer un diccionario anidado con el número de cola como clave y otro diccionario interno donde la clave es la ruta de vuelo y el valor es el dígito. El diccionario anidado idealmente se vería así:

d = {001C :{  {(VB, MI): 1}, {(CC, SK): 2},  {(KF, KC):1} },
    004N :{    {(AZ, AL): 2}, {(AU, NY):3},
    005F :{  {(ALB, TPA):5},  {(ORD, JAC):2},  ... }

¿usted me podría ayudar?

2
coelidonum 2 dic. 2019 a las 16:42

2 respuestas

La mejor respuesta

Una forma es usar groupby y dictar comprensión

{k: dict(zip(v['flight route'], v['digit'])) for k, v in df.groupby('Tail Number')}

Out[209]:
{'001C': {('VB', 'MI'): 1, ('CC', 'SK'): 2, ('KF', 'KC'): 1},
 '004N': {('AZ', 'AL'): 2, ('AU', 'NY'): 3},
 '005F': {('ALB', 'TPA'): 5, ('ORD', 'JAC'): 2}}
1
Andy L. 2 dic. 2019 a las 14:18

Puedes usar una comprensión dict como esta:

d = {i: {j:df.loc[(df['Tail Number']==i)&           
                  (df['flight route']==j),'digit'].iloc[0] #take every digit
           for j in df.loc[df['Tail Number']==i,'flight route']} #for every flight route
           for i in df['Tail Number']} #in each Tail Number

Dos comprensiones dict que, como for bucles, iteran sobre 1) número de cola y 2) ruta de vuelo (dentro de cada número de cola).

Out[8]: 
{'001C': {('VB', 'MI'): 1, ('CC', 'SK'): 2, ('KF', 'CC'): 1},
 '004N': {('AZ', 'AL'): 2, ('AU', 'NY'): 3},
 '005F': {('ALB', 'TPA'): 5, ('ORD', 'JAC'): 2}}

Si tiene un índice múltiple, es posible que primero deba hacer

df = df.reset_index()
1
Jim Eisenberg 2 dic. 2019 a las 14:16