【问题标题】:Python code in sequential processing dependency顺序处理依赖中的 Python 代码
【发布时间】:2019-05-19 07:20:58
【问题描述】:

我是 Python 新手,在我的一个代码中遇到了性能问题。

我有 2 个数据帧(比如 Df1 和 Df2)。

Df1 = pd.DataFrame({'A': [1,1,1,2,3,3,4,4,4,5,5],
                   'B':['P1','P2','P3','P1','P4','P2','P1','P6','P3','P2','P8'],
                   'C': [1,2,1,2,1,3,1,1,2,3,2],
                   'D':[100,100,100,200,300,300,400,400,400,500,500],
                   'E':[200,200,200,50,100,100,100,100,100,100,100],
                   'F':[50,50,50,50,150,150,100,100,100,333,333]})

Df2 =pd.DataFrame({'B':['P1','P2','P3','P4','P5','P6','P7','P8','P9','P10'],
                   'L1':[1,4,0,0,2,3,6,56,5,0],
                   'L2':[45,3,0,10,2,4,6,1,6,10],
                   'L3':[0,0,34,10,24,13,19,6,10,10]})

我想要做的是一次处理 A 的 1 个值(即总是在 A=2 之前处理 A=1)。这样做的原因是在 A=1,我正在寻找 Df2 中 B 的值(A=1 有 P1、P2 和 P3,我通过加入 Df1 从 Df2 获得 P1、P2 和 P3 的 L1、L2 和 L3和 Df2)。基于对 L1 、 L2 、L3 和 C,D,E,F 的值的一些计算。我将 A=1 中的每一行的决定分配为 L1 或 L2 或 L3。例如,假设 A=1,分配如下所示:

Df3= pd.DataFrame({'A': [1,1,1],
                   'B': ['P1','P2','P3'],
                   'C': [1,2,1],
                   'D':[100,100,100],
                   'E':[200,200,200],
                   'F':[50,50,50],
                   'L1':[1,4,0],
                   'L2':[45,3,0],
                   'L3':[0,0,34],
                   'Decision':['L1','L1','L3']})

现在由于 A=1 的决定是 L1,L1 和 L3,它将继续从 Df2 中减去 C 的值 即它将从 Df2 (P1,L1)=1-1=0 中减去 1,从 Df2(P2,L1)=4-2=2 中减去 2 并从 Df2 (P3,L3)=34-1=33 中减去 1 因此更新后的 Df2 将如下所示:

Df2 =pd.DataFrame({'B':['P1','P2','P3','P4','P5','P6','P7','P8','P9','P10'],
                   'L1':[0,2,0,0,2,3,6,56,5,0],
                   'L2':[45,3,0,10,2,4,6,1,6,10],
                   'L3':[0,0,33,10,24,13,19,6,10,10]})

对于 A=2 重复相同的循环,依此类推。由于 A=1 的决定改变了 Df2,因此它改变了 A=2 的结果,依此类推。到目前为止,我正在为每个 A 运行循环

我有大约 2 亿条记录的数据集 Df1,其中有 2500 万个不同的 A 值。Df2 是 50 万条记录。我正在运行循环 2500 万次,总运行时间约为 12 天。我尝试在 Df1 和 Df2 上建立索引/faster joins,根据一些规则对 Df1 进行子集化,但这并没有太大帮助(它仅将运行时间缩短了 2-3 天)

有没有更快的方法来做这个活动?特别是不运行循环,但仍按顺序处理 A 的每个值(因为之前的决定会改变未来的决定)

提前感谢您的建议。

【问题讨论】:

    标签: python pandas numpy dataframe


    【解决方案1】:

    我在下面发布了我的代码。虽然它没有预先使用任何 for 循环,但我不知道这是否会帮助您克服时间限制。祝你好运!

    df3 = df1.merge(df2, on="B")
    # Your decison maker
    import random
    def f(x=1):
        return random.choice(['L1', 'L2', 'L3'])
    
    df3["Decision"] = df3.apply(lambda x: f(x),axis=1)
    df3.sort_values(by='A').reset_index(drop=True, inplace=True)
    
    def ff(x):
        global df2
        df2.loc[df2.B == x.B, x.Decision] -= x.C
        return 
    
    a = df3[["B", "Decision", "C"]].apply(lambda x: ff(x), axis=1)
    
    df2
    

    请告诉我这是否让 2 亿条记录变得更容易(我会拍拍自己的后背:P)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-13
      • 2012-09-19
      • 1970-01-01
      • 2011-03-22
      相关资源
      最近更新 更多