Какой эффективный способ проверки значений нескольких строк с одинаковым значением ключа в двух разных файлах / файлах Excel? - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть два excel-файла. Оба содержат информацию об одних и тех же объектах данных. Объекты данных идентифицируются по номеру объекта (столбец ON), который имеет тип str.

пример:

Table 1                                Table 2
ON      colA  colB  colToUpdate         ON   colImportant
1.2.3    abc   123                      1.2.3      inf
2.9.6    ert   987                      1.2.3      mat
3.5.0    nms   021                      2.9.6      mat
                                        2.9.6      tr
                                        2.9.6      ch
                                        3.5.0      tr

и

myValues={inf, ch}

Задача:

Мне нужно проверить, находится ли одно из значений colImportant в таблице 2 в моем myValues и что объект данных (строка с тем же номером объекта) должен получить значение 'Ok' в colToUpdate в df1.

ожидание

new Table 1
   ON      colA  colB  colToUpdate        
   1.2.3    abc   123     Ok                
   2.9.6    ert   987     Ok               
   3.5.0    nms   021     NaN     

Я думал о том, чтобы сохранить оба в отдельном фрейме данных (table1 ind df1 и table2 в df2) и всегда искать один и тот же номер объекта в df2 при обновлении следующего столбца в df1. Но это всегда будет выполнять поиск по всему df2 (существует около 30000 объектов данных, что означает 30000 строк в df1. В df2 имеется 75000 строк, поскольку один объект данных может храниться несколько раз, а другое значение в colImportant, как вы можете видеть выше).

Другая идея состоит в том, чтобы сделать tempCol в df1, где я помещаю все значения из colImportant в df2 с разделителем, например , (НО КАК, мне нужно немного объединение нескольких строк в одну в df2 и затем объединение dfs на 'ON'). Затем, когда я хочу обновить строки в df1 по некоторым критериям, я должен проверить разделенные значения. Закончено, я могу удалить tempCol. Это должно выглядеть так:

  Table 1                                
    ON      colA  colB  colToUpdate tempCol       
    1.2.3    abc   123               inf,mat       
    2.9.6    ert   987               mat,tr,ch      
    3.5.0    nms   021               inf

1 Ответ

1 голос
/ 25 апреля 2019

Вот мой подход:

tmp_df = df2.groupby('ON').colImportant.apply(lambda x: 'OK' if (~x.isin(myValues)).any() 
                                                             else np.nan)

df1=df1.merge(tmp_df.reset_index()[['colImportant']], 
               left_on=df1.ON, 
               right_on=tmp_df.index).drop('key_0', axis=1)

Вывод:

+----+-------+--------+----------------+
|    | ON    | colA   | colImportant   |
|----+-------+--------+----------------|
|  0 | 1.2.3 | abc    | OK             |
|  1 | 2.9.6 | ert    | OK             |
|  2 | 3.5.0 | nms    | nan            |
+----+-------+--------+----------------+

Не идеально, но я думаю, что вы можете с этим разобраться.

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