Сложное Приблизительное Соответствие VLOOKUP Эквивалент в Python - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть два CSV-файла, которые выглядят примерно так:

CSV1:

ID     From_Depth   To_Depth
ABC    314          315
ABC    315          316
ABC    316          317
ABC    317          318
ABC    319          320
ABC    320          321
ABC    321          322
ABC    322          323
ABC    323          324

CSV2:

ID     Position     Label
ABC    314.366      68
ABC    315.476      68
ABC    315.964      68
ABC    316.321      69
ABC    317.953      69
ABC    318.246      69
ABC    318.75       70
ABC    319.341      70
ABC    320.054      71
ABC    320.826      71
ABC    321.562      71
ABC    322.206      72
ABC    322.953      72
ABC    323.058      72

Что я хочу сделать, это создатьдополнительный столбец в csv1 под названием «Метка», который содержит метку позиции (в csv2), ближайшую к среднему значению From_Depth и To_Depth (в csv1).

Выходной CSV будет выглядеть следующим образом:

ID     From_Depth   To_Depth    Label
ABC    314          315         68
ABC    315          316         68
ABC    316          317         69
ABC    317          318         69
ABC    319          320         70
ABC    320          321         71
ABC    321          322         71
ABC    322          323         72
ABC    323          324         72

В Excel я могу использовать VLOOKUP для достижения этой цели (при условии, что в Excel два CSV расположены рядом):

= VLOOKUP ((C2 + B2) / 2, $ E $ 2: $ F $ 15,2, TRUE)

Я хочу знать, как выполнить то же самое в python.Мне кажется, что VLOOKUP 'эквиваленты' , такие как merge или insert с map, не способны справиться с более сложной задачей, такой как та, что у меня есть.

1 Ответ

1 голос
/ 24 сентября 2019

Предположим, у вас есть csv1 в df1 и csv2 в df2

, вы можете создать новый столбец в df1 с применимой формулой, а затем объединить с этим -

import pandas as pd

df1 = pd.read_csv('csv1.csv')
df2 = pd.read_csv('csv2.csv')

df1['avg_depth'] = (df1['From_Depth'] + df1['To_Depth'])/2
df_merged = pd.merge(df1, df2, left_on='avg_depth', right_on='Position', how='left')
df_merged = df_merged[['ID', 'From_Depth', 'To_Depth', 'Label']]

df_merged.to_csv('output_csv.csv', index=None)

Что я могу понятьиз вашей формулы поиска - средние глубины в csv1 ищутся с помощью столбца позиции в csv2, если он найден, он занимает столбец F (метка).

Редактировать: Как уже упоминал Матиас, pd.merge_asof получает ближайшие значения ключа соединения.Можно также использовать это

df_merged = pd.merge_asof(df1.sort_values('avg_depth'), df2.sort_values('Position'), left_on='avg_depth', right_on='Position', direction='nearest', suffixes=['', '_2'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...