首页 > 解决方案 > 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')

我认为诀窍可能是以不同的方式格式化数据类型,但我不确定。

标签: python-3.xpandas

解决方案


尝试这个:

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,即您尝试匹配的下一个值。原因是两个列表之间的单个匹配就足够了。


推荐阅读