如果第三个单元格匹配,将值从一个数据帧的一个单元格复制到另一个数据帧的最快方法

时间:2020-01-02 08:03:27

标签: python pandas

我有一个主数据帧,其中包含750至3000行数据。

我有一个每日订单数据框,其中包含3000到5000行数据。

如果在主数据框中找到了每日订单数据框的产品代码,我将得到物料成本。否则,它将被标记为无效并删除。

我目前通过2个for循环来执行此操作。但是我将不得不做更多这样的比较和数据更新(其他字段进行比较,其他值进行复制) 最有效的方法是什么?

我无法使该列与主数据帧的索引列进行比较。 在这种情况下,产品代码在主数据库中可能是唯一的,我可以进行合并,但是在其他情况下,我可能不得不比较其他值,例如供应商所在的城市,而这些值可能不是唯一的。

我似乎在所有Python代码中都反复这样做,我想学习最有效的方法。

Order DF:
[![Order csv from which the Order DF is created][1]][1]
Master DF
[![Master csv from which Master DF is created][1]][1]
def fillVol(orderDF,mstrDF,paramC,paramF,notFound):

    orderDF['ttlVol']=0
    for i in range(len(orderDF)):
        found=False
        for row in mstrDF.itertuples():
            if (orderDF.loc[i,paramC]==getattr(row,paramC)):
                orderDF.loc[i,paramF[0]]=getattr(row,paramF[0])#mtrl cbf
                found=True
                break
        if (found==False):
            notFound.append(inv.loc[i,paramC])

    inv['ttlVol']=inv[paramF[0]]*inv[paramF[2]]
    return notFound

我正在传递要比较的列名和要填充数据的列名,因为在命名csv时会有一些细微的变化。在我共享的数据中,物料量为CBF,在某些情况下为CBM

数据列不能为索引,因为任何列中都没有唯一数据,它始终是使它们唯一的值的组合。

在这种情况下,数据是浮点数,可以使用numpy,但在其他情况下(例如从主数据库复制城市名称),数据是字符串。 numpy是对类似问题的其他人的建议

1 个答案:

答案 0 :(得分:0)

我不知道这是否是最有效的方法-作为先使用Fortran然后使用C进行编程的人,我始终支持基本数据类型,并且此解决方案未使用基本数据类型。这绝对是一个高度Pythonic的解决方案。

orderDF=orderDF[orderDF[ParamF].isin(mstrDF[ParamF])]
orderDF=orderDF.reset_index(drop=True)

我在orderDF和msterDF数据帧上使用左合并来复制所有相关值

orderDF=orderDF.merge(mstrDF.drop_duplicates(paramC,keep='last')[[paramF[0]]]', how='left',validate = 'm:1')