将字典中的值匹配到数据框的行值,并将数据添加到该行

时间:2019-10-09 13:21:09

标签: python pandas dictionary

如何将字典中的值作为df的新列中的值添加,但通过字典中的键值与现有行相关联

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()

我以为这样可以,但是会抛出索引错误。

     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

问题是我的字典中不一定有与我要向其中添加列和值的df中的每种情况都不匹配的键。

3 个答案:

答案 0 :(得分:1)

jason m的内容为基础,这可能不是最适合您的用例的数据结构

话虽如此,如果我了解您的用例,您想根据字典将地址与给定的caseno相关联(并且期望caseno在某些地址实例中可能不存在),则可以使用异常处理,仅选择地址存在的地址。

下面的代码可能是这样做的简单方法(但绝不是最有效的方法)

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

输出:

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

答案 1 :(得分:0)

我相信您需要:

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                    

或者:

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                                   

对于缺少的列表:

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                                 []               

答案 2 :(得分:0)

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

这应该给出您的预期输出。