Python 字典中数据帧的错误列映射
我正在尝试映射2个数据帧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
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
第二种方法正是我想要的,你救了我。很高兴它成功了,欢迎你!