0

我有两个看起来像这样的 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 中创建一个名为“标签”的附加列,其中包含最接近 From_Depth 和 To_Depth 平均值(在 csv1 中)的位置标签(在 csv2 中)。

输出 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 来完成此操作(假设两个 csv 在 excel 中并排):

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

我想知道如何在 python 中完成同样的事情。在我看来,VLOOKUP的“等价物”(例如mergeinsertwith map)无法处理更复杂的任务,例如我所拥有的任务。

4

1 回答 1

1

假设您在 df1 中有 csv1,在 df2 中有 csv2

您可以使用适用的公式在 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 列(标签)。

编辑:正如 Matthias 提到的 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'])
于 2019-09-24T02:13:36.403 回答