如何在没有for循环的情况下以行方式检查两个数据帧中的值

时间:2018-07-05 21:19:44

标签: python pandas numpy for-loop

我在避免在代码段中使用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.selectnp.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

1 个答案:

答案 0 :(得分:1)

在这种情况下,我将根据duplicatedIDs primaryIDsecondaryID创建一个字典,然后使用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值。