Python 字典中数据帧的错误列映射

Python 字典中数据帧的错误列映射,python,dataframe,dictionary,mapping,Python,Dataframe,Dictionary,Mapping,我正在尝试映射2个数据帧 L1 ship city code NaN aa 12 NaN bb 23 NaN cc 13 NaN dd 43 B1 ship city 21 dd 32 bb 43 aa 654 cc 34 bb 54 aa 我想将列cod

我正在尝试映射2个数据帧

L1

ship  city   code  

 NaN   aa      12    
 NaN   bb      23    
 NaN   cc      13    
 NaN   dd      43  
B1

 ship  city    
 
 21     dd     
 32     bb      
 43     aa      
 654    cc      
 34     bb     
 54     aa

 
我想将列
code
L1
映射到
B1
。我尝试使用字典进行映射,所以得到的结果如下

预期结果=

ship  city   code  
 
 21    dd      43    
 32    bb      23    
 43    aa      12    
 654   cc      13    
 34    bb      23    
 54    aa      12



 code_dict = dict(zip(L1['city'],L1['code'])) 
 B1['code'] = L1['city'].map(code_dict)
 print(B1)
我得到的结果不是我所期望的

请帮我解决这个问题

 ship  city    code  
 
 21    dd       12    
 32    bb       23    
 43    aa       13    
 654   cc       43    
 34    bb       NaN   
 54    aa       NaN 

我想你在寻找:

从导入数据帧
df1=数据帧([
{'city':'aa','code':12},
{'city':'bb','code':23},
{'city':'cc','code':13},
{'city':'dd','code':43}
])
df2=数据帧([
{'ship':'21','city':'dd'},
{'ship':'32','city':'bb'},
{'ship':'43','city':'aa'},
{'ship':'654','city':'cc'},
{'ship':'34','city':'bb'},
{'ship':'54','city':'aa'}
])
预期结果=df2.merge(df1,on='city')
打印(预期结果)
结果:

船舶城市代码
0 21 dd 43
132BB23
2 34 bb 23
3 43 aa 12
4 54 aa 12
5654 cc 13
两个选项

数据设置:

ship=[np.nan]*4
city=['aa','bb','cc','ddd']
code=[12,23,13,43]

ship2=[21,32,43,654,34,54]
city2=['dd','bb','aa','cc','bb','aa']

l1=pd.DataFrame({"ship":ship,"city":city,"code":code})
b1=pd.DataFrame({"ship":ship2,"city":city2})
第1至合并城市:

l1.merge(b1,on=['city'],how='inner')[['ship_y','city','code']].rename({"ship_y":"ship"},axis=1)
第二次使用地图/字典:

ship_city_d = dict(zip(l1.city, l1.code)) # build the dictionary
b1['code']=b1['city'].apply(lambda x: str(ship_city_d.get(x,"Not Found")) )

注意:如果找不到键,b1将有一些条目,如果不需要,您可以在下一步删除这些记录。

L1和b1没有通用的
code
列?这是打字错误吗?你是基于这个城市加入的吗?如果是这样的话,
21 dd 43
似乎是正确的结果。每个城市都有一个与之相关联的唯一“代码”,我已经将其映射到一本字典——“代码”。将每个“城市”对应的“代码”从“L1”映射/复制到“B1”是我在这里尝试实现的。这将对您起作用
L1。合并(B1,on=['city'],how='inner')[['ship_y','city','code']]。重命名({“ship_y”:“ship”},axis=1)
我的实际数据集有许多列,如果合并,我将不得不重命名每个重复的列。你能建议一个使用字典或不必重命名列的解决方案吗?
expected\u result=df2.merge(df1,on='city')print(expected\u result)
当我尝试这个方法时,我得到了一个“ship”的重复列。现在我有了两个新的专栏
ship_x
(带值)和
ship_y
(仅带Nan值)谢谢
simpleApp
第二种方法正是我想要的,你救了我。很高兴它成功了,欢迎你!