熊猫:当列值重叠时,使用完全匹配在一列上合并

时间:2018-07-10 18:18:27

标签: python-3.x pandas

我要基于一个列(SKU)中的值合并两个数据框。 “ SKU”值各不相同。例如,SKU值的范围从“ 00047”到“ TPA20839”。但是,它们始终是字母数字。

当从csv文件读取数据帧时,我将“ SKU”列转换为字符串,以便它们在同一数据类型上合并。数据正确合并,但字符串值重叠时除外。

例如,有一个df_master ['SKU']值=“ 6748”。 df_inv ['SKU']->“ 6748”和“ 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')

我认为诀窍可能是对数据类型设置不同的格式,但是我不确定。

1 个答案:

答案 0 :(得分:0)

尝试一下:

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语句继续到下一个needle,即您要匹配的下一个值。原因是两个列表之间的一个匹配就足够了。