Как проверить значения в двух фреймах данных построчно без цикла for - PullRequest
0 голосов
/ 06 июля 2018

У меня есть некоторые проблемы с использованием цикла for в моем фрагменте кода. У меня есть два кадра данных. Один основной фрейм данных, над которым я работаю, и дополнительный фрейм данных, в котором хранятся идентификаторы клиентов, которые, как известно, дублируются. Это означает, что один и тот же клиент имеет два (или более) идентификатора в системе, поскольку он мог зарегистрироваться более одного раза.

Основной фрейм данных выглядит следующим образом (в нем больше столбцов, чем 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

Мой текущий код выглядит так:

Это немного для определения индексов строк в 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);

Фрагмент кода для замены дублированных идентификаторов. Я использую 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

1 Ответ

0 голосов
/ 06 июля 2018

В этом случае я бы создал словарь из 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...