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.
3 respuestas
df['defadd'] = df['caseno'].apply(lambda x: def_dict.get(x)).fillna('')
Esto debería dar su salida esperada.
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
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 []