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

2024-10-02 04:17:35 发布

您现在位置:Python中文网/ 问答频道 /正文

如何将字典中的值添加为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中我试图添加列和值的每个case no。你知道吗


Tags: indffordata字典defdictpd
3条回答

我相信你需要:

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                                 []               
df['defadd'] = df['caseno'].apply(lambda x: def_dict.get(x)).fillna('')

这将给出您的预期输出。你知道吗

基于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               

相关问题 更多 >

    热门问题