我有两个数据框:
df1
PRA_Kod;WorkerId
1049;9024
0014;60260
0608;10506
20270/9;20270
9511;64473
0639;60264
0767;10509
.. .. .. . .
df2
WorkerId;Day;Time;W
1049;11;u.wyp;WE
1049;14;u.wyp;WE
64454;11;u.wyp;WE
0014;15;u.wyp;WE
64471;12;u.wyp;WE
64471;13;u.wyp;WE
0639;06;u.wyp;WE
0639;01;u.wyp;WE
0639;02;u.wyp;WE
0639;03;u.wyp;WE
64465;04;u.wyp;WE
64465;05;u.wyp;WE
... ... .. .
如果 df2['WorkerId'] 出现在 df1['PRA_Kod'] 中,我需要将 df2['WorkerId'] 列中的值更改为值 df1['WorkerId']。
结果框:
df_result
WorkerId;Day;Time;W
9024;11;u.wyp;WE
9024;14;u.wyp;WE
64454;11;u.wyp;WE
60260;15;u.wyp;WE
64471;12;u.wyp;WE
64471;13;u.wyp;WE
60264;06;u.wyp;WE
60264;01;u.wyp;WE
60264;02;u.wyp;WE
60264;03;u.wyp;WE
64465;04;u.wyp;WE
64465;05;u.wyp;WE
... ... .. .
这怎么办?
我正在努力:
df_result.loc[ df2['WorkerId'].eq == df1['PRA_Kod'].eq, df2['WorkerId']] = df1['WorkerId']
但我收到错误:ValueError:只能比较相同标签的系列对象。
您的线路的主要问题是
==
时,您所做的是请求筛选 df1 和 df2 中两列的逐行匹配。当您第一次将 df1 用作字典时,事情会变得更加顺利。
方法:
1。字典
这不是直接的
df1.to_dict()
,看到了吗?要么我们编写一个循环,要么我们转置它并重新设计列和索引,以便键:值对根据需要着陆:
map_dict = df1.set_index('PRA_Kod').T.to_dict('records')[0]
{'1049': '9024',
'0014': '60260',
'0608': '10506',
'20270/9': '20270',
'9511': '64473',
'0639': '60264',
'0767': '10509'}
2。地图
映射查找同时也是字典键的单元格,并将其替换为字典值。其他细胞保持原样。
df_result = df2.assign(WorkerId = df2.WorkerId.map(map_dict).fillna(df2.WorkerId))
WorkerId Day Time W
0 9024 11 u.wyp WE
1 9024 14 u.wyp WE
2 64454 11 u.wyp WE
3 60260 15 u.wyp WE
4 64471 12 u.wyp WE
5 64471 13 u.wyp WE
6 60264 06 u.wyp WE
7 60264 01 u.wyp WE
8 60264 02 u.wyp WE
9 60264 03 u.wyp WE
10 64465 04 u.wyp WE
11 64465 05 u.wyp WE
请参阅每个链接的问题,了解有关这两个步骤如何工作的更多详细信息。如果没有找到第 2 步的方法,我可能会选择
np.where
,测试值 .isin
字典键。