【发布时间】: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