我是Python的新手,正在努力解决我的一段代码中的性能问题。
我有两个数据帧(比如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]})
我想做的是一次处理1个A的值(即总是在A=2之前处理A=1 )。这样做的原因是在A=1,我在Df2中寻找B的值(A=1有P1,P2和P3,我正在通过加入Df1和Df2从Df2获得L1,L2和L3 of P1,P2和P3 )。通过对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,其中有2,500万条不同的值。Df2是50万条记录。我运行了2500万次循环,总运行时间大约为12天。我尝试在Df1和Df2上索引/faster连接,根据一些规则对Df1进行子集设置,但它没有太大帮助(它只减少了2-3天的运行时间)
有没有更快的方法来完成这项活动?特别是不运行循环,但仍然按顺序处理A的每个值(因为以前的决定改变了未来的决定)
提前感谢您的建议。
发布于 2019-01-05 23:09:25
我已经在下面发布了我的代码。尽管它在前面没有使用任何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)
https://stackoverflow.com/questions/53840402
复制相似问题