Python 3.x 熊猫:当列值重叠时,使用精确匹配在一列上合并

Python 3.x 熊猫:当列值重叠时,使用精确匹配在一列上合并,python-3.x,pandas,Python 3.x,Pandas,我有两个数据帧,我想根据一列(SKU)中的值进行合并。“SKU”值各不相同。例如,SKU值的范围从“00047”到“TPA20839”。但是,它们始终是字母数字 当从csv文件读取数据帧时,我将“SKU”列转换为字符串,以便它们合并到相同的数据类型上。除非存在重叠的字符串值,否则数据将正确合并 例如,有一个df_主机['SKU']value=“6748”。df_inv['SKU']->“6748”和“9006748”中有两个类似的值(两个不同的项目,6748==6748 9006784!=674

我有两个数据帧,我想根据一列(SKU)中的值进行合并。“SKU”值各不相同。例如,SKU值的范围从“00047”到“TPA20839”。但是,它们始终是字母数字

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

例如,有一个df_主机['SKU']value=“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')
我认为诀窍可能是以不同的格式设置数据类型,但我不确定。

尝试以下方法:

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

我不太明白问题所在,
9006784!=6748,所以它们绝对不应该合并。“90006784”的行是否因为不匹配而不再显示在输出中?默认的
merge
是一个内部合并,它只保留两个
数据帧共用键的行。在这种情况下,您可能希望进行正确的合并,因为名称为
df_master
就是这样。你能帮我理解吗?我读过关于右、左、内、外的书,但我不能把我的头绕在上面。当我执行INTERNAR时,两个键是否都应该显示,因为它都在两个数据帧中?更新:当使用“how=right”时,它将返回所有SKU,但相应的值为NaN。这只适用于像9006784和6748这样奇怪重叠的str。合并只能用于精确的键,因此9006748不会与另一个数据帧中的6748合并。由于最后4位数字的原因,您可能知道它们是相同的,但合并无法实现。如果你需要合并这样的东西,你需要使用更复杂的逻辑,或者如果总是最后4位,那么你可以只合并最后4个字符