我有一个主数据帧,其中包含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是对类似问题的其他人的建议
答案 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')