Cómo agregar valores del diccionario como valores en una nueva columna de df pero asociados con la fila existente por el valor de la clave en el diccionario

import pandas as pd
data = {'caseno': ['123', '456', '789', '000'], 'defname': ['defendant1', 'defendant2', 'defendant3', 'defendant4']}
df = pd.DataFrame.from_dict(data)

def_dict = {'123': ['123address', '123address2', '123csz'], '456':['456address', '456address2', '456csz']}

caseno_lst = df['caseno'].tolist()

Pensé que esto funcionaría, pero arroja un error de índice.

     for i in caseno_lst:
          for k, v in def_dict.items():
            if k == i:
              df['defadd'] = v
            else:
              pass

Expected output:

        caseno defname     defadd
    0    123   defendant1  [123address, 123adress2, 123csz]
    1    456   defendant2  [456address, 456address2, 456csz]
    2    789   defendant3
    3    000   defendant4

El problema es que mi diccionario no necesariamente tendrá una clave que coincida con cada caso en el df al que estoy tratando de agregar columnas y valores.

0
John Taylor 9 oct. 2019 a las 16:21

3 respuestas

La mejor respuesta
df['defadd'] = df['caseno'].apply(lambda x: def_dict.get(x)).fillna('')

Esto debería dar su salida esperada.

0
Danny 9 oct. 2019 a las 14:04

A partir de lo que dijo jason m, esta puede no ser la estructura de datos más adecuada para su caso de uso

Dicho esto, si entiendo su caso de uso, desea asociar las direcciones con un determinado caseno basado en el diccionario (y la expectativa es que el caseno puede no estar presente en algunos casos de direcciones), utilizaría el manejo de excepciones para solo recoja las que existan en la dirección.

El siguiente código podría ser una forma simple de hacerlo (pero de ninguna manera es la más eficiente)

df['defadd']=''
for index in df.index:
    try:
        df.loc[index,'defadd']=def_dict[df['caseno'][index]]
    except:
        df.loc[index,'defadd']=''

Salida:

  caseno     defname                             defadd
0    123  defendant1  [123address, 123address2, 123csz]
1    456  defendant2  [456address, 456address2, 456csz]
2    789  defendant3                                   
3    000  defendant4               
1
zhqiat 9 oct. 2019 a las 13:59

Creo que necesitas:

df['defadd'] = df['caseno'].map(def_dict).fillna('')

print (df)
  caseno     defname                             defadd
0    123  defendant1  [123address, 123address2, 123csz]
1    456  defendant2  [456address, 456address2, 456csz]
2    789  defendant3                                   
3    000  defendant4                    

O:

df['defadd'] = df['caseno'].map(lambda x: def_dict.get(x, ''))
print (df)
  caseno     defname                             defadd
0    123  defendant1  [123address, 123address2, 123csz]
1    456  defendant2  [456address, 456address2, 456csz]
2    789  defendant3                                   
3    000  defendant4                                   

Para las listas que faltan:

df['defadd'] = df['caseno'].map(lambda x: def_dict.get(x, []))
print (df)
  caseno     defname                             defadd
0    123  defendant1  [123address, 123address2, 123csz]
1    456  defendant2  [456address, 456address2, 456csz]
2    789  defendant3                                 []
3    000  defendant4                                 []               
0
jezrael 9 oct. 2019 a las 14:05
58305156