Pandas Frame Iteration:效率

时间:2016-07-09 05:08:22

标签: python pandas

我有2个单独的数据集

数据集1:已加载项目的数据库以及加载项目的数据库。它看起来像这样 Loaded DataSet

数据集2:已卸载的项目数据库及卸载时的数据库。它与上面的数据集完全相似

hse_time的格式为" 2016-01-07 19:38:56"即" YYYY-mm-dd HH:MM:SS"

现在我的练习是用相应的卸载时间,加载的次数和卸载次数,当前状态[已加载或已卸载]

标记每个已加载项目

数据集有以下规则:

  1. 可以多次加载和卸载项目。
  2. 由于这是针对一个特定的时间范围,我们可以将一个项目卸载,因为它被加载到数据集中[例如:我正在分析JFM' 16数据,它可能是在12月之前加载的#39; 15但在Jan' 16中卸载

  3. 没有加载次数=卸载的次数

  4. 没有加载次数=卸载次数+ 1
  5. 现在我编写了一个算法来满足所有条件并标记我需要的所有东西,但问题是我有一个400K的数据集,我的算法运行需要永远,因为我要迭代每一行在加载框架中。

    AnyOther方法这样做,以便我可以缩短我的运行时间?

    这是我的代码:

    Loaded_Frame     = Loaded_Frame.sort_values(by=["BranchID","hse_time"],ascending=True)
    Unloaded_Frame   = Unloaded_Frame.sort_values(by["BranchID","hse_time"],ascending=True)
    Grouped          = Loaded_Frame.groupby(["BranchID","Item Name"]).agg({"weight":"count"}).reset_index()
    Grouped.rename(columns={"weight":"LoadedCount"},inplace=True)
    temp_frame       = Unloaded_Frame.groupby(["BranchID","Item Name"]).agg({"weight":"count"}).reset_index()
    temp_frame.rename(columns={"weight":"UnLoadedCount"},inplace=True)
    Grouped          = Grouped.merge(temp_frame,on=["BranchID","Item Name"],how="outer")
    Grouped["UnLoadedCount"] = Grouped["UnLoadedCount"].fillna(0)
    Grouped["LoadedCount"]   = Grouped["LoadedCount"].fillna(0)
    

    主要逻辑

    import numpy as np
    Final_Frame=Loaded_Frame.copy()
    Final_Frame["Multiple Loads"]=np.nan
    Final_Frame["Number of times Loaded"]=np.nan
    Final_Frame["Number of times UnLoaded"]=np.nan
    Final_Frame["UnLoaded Date"]=np.nan
    Final_Frame["Load Status"]=np.nan
    
    for i in Grouped.index:
       x=UnLoaded_Frame[(UnLoaded_Frame["BranchID"]==Grouped.loc[i,"BranchID"])\
                     & (UnLoaded_Frame["Item Name"]==Grouped.loc[i,"Item Name"])].reset_index()
    y=Loaded_Frame[(Loaded_Frame["BranchID"]==Grouped.loc[i,"BranchID"]) \
                   & (Loaded_Frame["Item Name"]==Grouped.loc[i,"Item Name"])].reset_index()
    Loaded_Count=y["BranchID"].count()
    Unloaded-Count=x["BranchID"].count()
    
    if Loaded_Count==Unloaded: #Condition where both are equal
        Multiple_Load=False
        if Loaded_Count>1:
            Multiple_Load=True
        else:
            Multiple_Load=False
        for j in y.index:
        Final_Frame.loc[((Final_Frame["BranchID"]==y.loc[j,"BranchID"]) \
                         & (Final_Frame["Item Name"]==y.loc[j,"Item Name"]) \
                         & (Final_Frame["hse_time"]==y.loc[j,"hse_time"]))\
                        ,["Multiple Loads","Number of times Loaded","Number of times UnLoaded","UnLoaded Date","Load Status"]]\
        =[Multiple_Load,Loaded_Count,UnLoaded_Count,x.loc[j,"hse_time"],"Unloaded"]
    

    问题是我在运行此代码时,需要花费大量时间迭代超过400K的记录。

0 个答案:

没有答案