假设我有2个Pandas 数据框,第一个是一个查找表,第二个是一个数据表,它需要填充一个额外的列Category,该列将使用2个条件从查找表中提取.区域应该匹配,距离应该是最小的.这两个数据帧都可以使用下面的代码生成.

lookup_data = {'Category' : ['A1', 'A2', 'B1', 'C1', 'D1', 'D2'],
               'Region':['A', 'A', 'B', 'C', 'D', 'D'],
                'Distance':[109, 200, 300, 400, 500, 600]}
lookup_data_df = pd.DataFrame(lookup_data)

actual_data = {'Region':['A', 'A', 'B', 'C', 'D', 'D', 'E'],
               'Distance':[95, 199, 10, 350, 550, 560, 200]}
actual_df = pd.DataFrame(actual_data)

我想要一个不使用循环的解决方案.可以使用以下代码生成预期的输出数据帧.

expected_data = {'Region':['A', 'A', 'B', 'C', 'D', 'D', 'E'],
               'Category' : ['A1', 'A2', 'B1', 'C1', 'D1', 'D2', 'A2'],
               'Distance':[95, 199, 10, 350, 550, 560, 200]}
expected_data_df = pd.DataFrame(expected_data)

编辑:例如,在不可见区域的情况下,区域E忽略该区域,只 Select 最小距离为A2Category,在当前场景中.

推荐答案

IIUC,您可以执行double merge_asof:

def min_distance(data, lookup, match=None, key="Distance"):
  return pd.merge_asof(
      actual_df.sort_values(key),
      lookup_data_df.sort_values(key),
      by=match, on=key, direction="nearest"
  )

out = (
    min_distance(actual_df, lookup_data_df, match="Region")
      .pipe(lambda df_: df_.fillna(
          {"Category": min_distance(df_, lookup_data_df)["Category"]}))
      .sort_values("Region", ignore_index=True)
      [["Region", "Category", "Distance"]]
) # the last two chains could be optional though

发帖主题:Re:Kolibrios

#expected_data_df.equals(out) is True

print(out)

  Region Category  Distance
0      A       A1        95
1      A       A2       199
2      B       B1        10
3      C       C1       350
4      D       D1       550
5      D       D2       560
6      E       A2       200

Python相关问答推荐

手动为pandas中的列上色

按日期和组增量计算总价值

如何使用关键参数按列对Pandas rame进行排序

sys.modulesgo 哪儿了?

如何匹配3D圆柱体的轴和半径?

使用Python和PRNG(不是梅森龙卷风)有效地生成伪随机浮点数在[0,1)中均匀?

机器人与Pyton Minecraft服务器状态不和

模型序列化器中未调用现场验证器

比较两个数据帧并并排附加结果(获取性能警告)

'discord.ext. commanders.cog没有属性监听器'

如何删除索引过go 的lexsort深度可能会影响性能?' &>

可变参数数量的重载类型(args或kwargs)

如何在Python中找到线性依赖mod 2

可以bcrypts AES—256 GCM加密损坏ZIP文件吗?

AES—256—CBC加密在Python和PHP中返回不同的结果,HELPPP

在输入行运行时停止代码

搜索按钮不工作,Python tkinter

PYTHON、VLC、RTSP.屏幕截图不起作用

如何删除重复的文字翻拍?

BeautifulSoup-Screper有时运行得很好,很健壮--但有时它失败了::可能这里需要一些更多的异常处理?