Vlookup в Python с несколькими условиями - PullRequest
0 голосов
/ 19 января 2019

У меня есть два кадра данных, загруженных из файлов CSV в Python.

Один из них содержит данные следующего типа:

 Well   Zones   Inflow   
 E18    A       0.45
 E23    B       0.33
 E25    C       0.2
 E18    B       0.2
 E23    A       0.67
 E25    D       0.12
 E23    B       0.2
 E18    A       0.67
 E25    D       0.12

, а другой:

 Well   Zones   Distance
 E18    A       5.3
 E23    B       2.1
 E25    C       4.8
 E18    B       5.4
 E23    A       2.3
 E25    D       5.5

Мне нужно сопоставить два кадра данных на основепри двух условиях: «Хорошо» и «Зоны», чтобы первый кадр данных был обновлен следующим образом:

 Well   Zones   Inflow   Distance
 E18    A       0.45       5.3
 E23    B       0.33       2.1
 E25    C       0.2        4.8
 E18    B       0.2        5.4
 E23    A       0.67       2.3
 E25    D       0.12       5.5

Это может показаться тривиальным из приведенного выше примера, потому что я включил его здесь только для описания моегопроблема.Фактические данные - это действительно большой файл с перетасованными данными в оригинальном файле.

Это то, что я использовал для сопоставления только по одному критерию, и оно отлично работает:

   df1.insert(13, 'Distance', df1['Well'].map(df2.set_index('Well')['Distance']))

*** 13 - это столбец для вставки сопоставленных данных из

. Однако мне нужен тот же (или любой другой) способ сопоставления двух кадров данных, но с 2 или более условиями (потому что зависит от зоны и скважины).расстояние различается), поэтому не только условия "Хорошо", но и "Хорошо" + "Зоны".

1 Ответ

0 голосов
/ 19 января 2019

Merge фреймы данных:

df1.merge(df2, how='left')

Слияние автоматически находит столбцы в обоих фреймах данных и совпадает, где они оба равны.Ключевое слово how=left указывает, что вы хотите сохранить все строки в первом кадре данных и найти совпадающие строки во втором кадре данных.Более подробную информацию смотрите в документации.

Если есть еще столбцы с одинаковыми именами, но вы хотите сопоставлять только эти два, используйте

df1.merge(df2, how='left', on=['Well', 'Zones'])

Выходные данные:

#  Well Zones  Inflow  Distance
#0  E18     A    0.45       5.3
#1  E23     B    0.33       2.1
#2  E25     C    0.20       4.8
#3  E18     B    0.20       5.4
#4  E23     A    0.67       2.3
#5  E25     D    0.12       5.5
#6  E23     B    0.20       2.1
#7  E18     A    0.67       5.3
#8  E25     D    0.12       5.5
...