python-3.x - Pandas:当列值重叠时使用精确匹配合并一列
问题描述
我有两个要根据一列 (SKU) 中的值合并的数据框。“SKU”值是多种多样的。例如,SKU 值的范围从“00047”到“TPA20839”。但是,它们始终是字母数字。
当从 csv 文件中读取数据帧时,我将“SKU”列转换为字符串,以便它们合并为相同的数据类型。数据正确合并,除非有重叠的字符串值。
例如,有一个 df_master['SKU'] value = "6748"。df_inv['SKU'] -> "6748" AND "9006748" 中有两个相似的值(两个不同的项目,6748 == 6748 9006784 != 6748)。
这会导致该行不会出现在新的数据框中。
我希望它完全匹配,类似于 excel 中的 =MATCH('','',0) 函数。你能帮我实现这个吗?
df_master['SKU'] = df_master['SKU'].astype(str)
df_inv['SKU'] = df_inv['SKU'].astype(str)
df_new = pd.merge(df_inv, df_master, on='SKU')
df_new.to_csv('new-master.csv', sep=',', encoding='utf-8')
我认为诀窍可能是以不同的方式格式化数据类型,但我不确定。
解决方案
尝试这个:
vals_matched = []
haystacks = df_inv['SKU'].astype(str).tolist()
needles = df_master['SKU'].astype(str).tolist()
for needle in needles:
for haystack in haystacks:
if needle in haystack:
vals_matched.append(needle)
break
df_master = df_master[df_master.SKU.astype(str).isin(needles)]
该break
语句继续到 next needle
,即您尝试匹配的下一个值。原因是两个列表之间的单个匹配就足够了。
推荐阅读
- javascript - 为什么 localeCompare 不能按我的预期工作?
- c++ - 在蝙蝠类代码中,这给了我错误:重载“蝙蝠()”的调用是模棱两可的蝙蝠();
- c++ - 从类中返回一个字符串——奇怪的行为
- r - R,以变量值为条件删除重复行
- android - Unity 和 Oculus Go。在内部存储上读/写
- python - 从python中的JSON字符串中提取某个值
- sql - 将查询从 LINQ (EF) 转换为 SQL 时,不应用 Where 子句
- java - 如何禁用 JavaFX 中的最大化选项?
- scala - Spark Scala 中的动态映射语句
- java - FOP 2.3:fo:external-graphic 的问题