【问题标题】:Complicated Approximate Match VLOOKUP Equivalent in PythonPython中复杂的近似匹配VLOOKUP等价物
【发布时间】:2020-01-24 02:05:26
【问题描述】:

我有两个看起来像这样的 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 中完成同样的事情。在我看来,诸如 mergeinsertmap 之类的 VLOOKUP '等价物' 无法处理更复杂的任务,例如我所拥有的任务。 p>

【问题讨论】:

  • 您是使用pandas 还是想用标准库解决它?

标签: python vlookup approximate


【解决方案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'])

【讨论】:

  • 这仅在平均深度恰好在 csv2 中时才有效。在大多数情况下不会,您需要在 csv2 中找到最接近的匹配项(尝试使用示例数据)。正如stackoverflow.com/a/55754579/3830997 中所讨论的,您可能可以使用 merge_asof 轻松更新它。
  • 我想你是对的,谢谢你的洞察力,很想了解更多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 2019-04-18
  • 2016-01-08
  • 2021-07-09
相关资源
最近更新 更多