首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >顺序处理依赖项中的Python代码

顺序处理依赖项中的Python代码
EN

Stack Overflow用户
提问于 2018-12-19 04:15:56
回答 1查看 117关注 0票数 2

我是Python的新手,正在努力解决我的一段代码中的性能问题。

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

代码语言:javascript
运行
复制
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,赋值如下所示:

代码语言:javascript
运行
复制
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将如下所示:

代码语言:javascript
运行
复制
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的每个值(因为以前的决定改变了未来的决定)

提前感谢您的建议。

EN

回答 1

Stack Overflow用户

发布于 2019-01-05 23:09:25

我已经在下面发布了我的代码。尽管它在前面没有使用任何for循环,但我不知道这是否能帮助您克服时间限制。祝好运!

代码语言:javascript
运行
复制
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)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53840402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档