我在避免在代码段中使用for循环时遇到了一些问题。 我有两个数据框。我正在处理的一个主数据框和一个辅助数据框,用于存储已知重复的客户ID。这意味着,同一位客户在系统中拥有两个(或多个)ID,因为他可能已经多次注册。
主数据框如下所示(它的列多于3):data
index ID gender ...
0 22 M
1 23 F
2 24 F
3 33 F
4 34 M
5 35 F
6 67 F
7 68 F
补充数据框:
duplicatedIDs
index primaryID secondaryID
0 22 34
1 23 33
2 35 68
我当前的代码如下:
这有点在存储重复ID的duplicatedIDs
df中发现行索引:
n_index = [] # Row index in duplicate_df of duplicated ids
for j in range(1,len(duplicatedIDs['primaryID'])):
if ( (duplicatedIDs['primaryID'][j] in (
data['ID'].values)) & (duplicatedIDs['secondaryID'] [j] in (data['ID'].values))):
n_index.append(j);
用于替换重复ID的代码段。我使用secondaryID
作为主要对象:
for j in n_index:
if ( (duplicatedIDs['primaryID'][j] in (data['ID'].values)) & (duplicatedIDs['secondaryID'][j] in (data['ID'].values))):
data.loc[data['ID'] == duplicatedIDs['primaryID'][j], 'ID'] = duplicatedIDs['secondaryID'][j]
我想避免for循环,因为duplicatedIDs
df有成千上万的行,并且需要一些时间才能完成。我试图对np.select
或np.where
进行操作,但是我无法使它们以某种方式在同一行级上运行。
操作后的主数据帧应如下所示:
index ID gender ...
0 34 M
1 33 F
2 24 F
3 33 F
4 34 M
5 68 F
6 67 F
7 68 F
答案 0 :(得分:1)
在这种情况下,我将根据duplicatedIDs
primaryID
和secondaryID
创建一个字典,然后使用df.replace
:
data.replace({'ID':dict(duplicatedIDs[['primaryID', 'secondaryID']].values)})
index ID gender
0 0 34 M
1 1 33 F
2 2 24 F
3 3 33 F
4 4 34 M
5 5 68 F
6 6 67 F
7 7 68 F
说明:
使用dict(duplicatedIDs[['primaryID', 'secondaryID']].values)
创建的字典如下:
{22: 34, 23: 33, 35: 68}
然后,使用df.replace
的嵌套字典语法,将已知重复项的值更改为它们的secondaryID
值。