根据另一个数据框替换数据框列中的值

问题描述 投票:0回答:1

我有两个数据框:

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:只能比较相同标签的系列对象。

python pandas dataframe assign
1个回答
0
投票

您的线路的主要问题是

  • 您的意思是使用 df1 作为字典(在一列中查找值,然后在同一行的第二列中获取值),
  • 但实际上,当您编写
    ==
    时,您所做的是请求筛选 df1 和 df2 中两列的逐行匹配。

当您第一次将 df1 用作字典时,事情会变得更加顺利。


方法:

  1. 将数据帧 df1 转换为字典,其中 key : val 对是 PRA_Kod : WorkerId,如 将 Pandas DataFrame 转换为字典
  2. 将此字典映射到数据框 df2 上,如基于字典设置 Pandas 值

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
字典键。

© www.soinside.com 2019 - 2024. All rights reserved.