问题描述
我正在对一些脚本进行故障排除,这些脚本处理大量记录,并偶尔引发内存错误。脚本在笔记本电脑上可以正常工作,但是当我们尝试将其移植到服务器时,这种内存行为就开始了。通过不再需要在数据帧上执行del命令,我已经在很大程度上克服了这一点,紧接着是gc.collect()。服务器的Python版本为3.6.9;我的笔记本电脑有3.7。
向我建议的一个技巧是在初始步骤中强制将数据类型设置为float32而不是float64(默认情况下,因为数据是从csv文件中读取的)。同样,现在将几个整数字段强制设置为int16。并且,一位同事建议将被视为“对象”但实际上是2个字符且仅有几十个值的另一个字段应视为“类别”。对float32和int16所做的更改已将数据框的大小减少了约40%,因此,我认为我们在这里的位置正确。
我将所有内容添加到了脚本中,然后执行了一个groupby命令-我正在测试的10,000条输入记录已膨胀到超过300万条。我看了看输出,似乎正在使用分组字段的每种可能组合产生输出。
关于它为何如此运行的任何想法?我没有运气找到任何东西。
import pandas as pd
myd = {'item': ['001','002','001','001'],'color': ['red','red','yellow','blue','red'],'selldate':['2020-01-01','2020-01-01','2020-02-01','2020-02-01'],'howmany': [1,1,1],'cost': [1.00,1.00,1.00],'price':[2.00,2.00,2.00]
}
mydf=pd.DataFrame(data=myd)
mydf
结果:
item color selldate howmany cost price
0 001 red 2020-01-01 1 1.0 2.0
1 002 red 2020-01-01 1 1.0 2.0
2 001 red 2020-02-01 1 1.0 2.0
3 001 yellow 2020-02-01 1 1.0 2.0
4 001 blue 2020-01-01 1 1.0 2.0
5 002 yellow 2020-01-01 1 1.0 2.0
6 002 yellow 2020-01-01 1 1.0 2.0
7 002 yellow 2020-01-01 1 1.0 2.0
8 001 yellow 2020-02-01 1 1.0 2.0
9 001 red 2020-02-01 1 1.0 2.0
分组依据:
mydf.groupby(['item','color','selldate'],as_index=False)[['howmany','cost','price']].sum()
结果(符合预期):
item color selldate howmany cost price
0 001 blue 2020-01-01 1 1.0 2.0
1 001 red 2020-01-01 1 1.0 2.0
2 001 red 2020-02-01 2 2.0 4.0
3 001 yellow 2020-02-01 2 2.0 4.0
4 002 red 2020-01-01 1 1.0 2.0
5 002 yellow 2020-01-01 3 3.0 6.0
将“颜色”列更改为“类别”:
mydf['color']=mydf['color'].astype('category')
mydf.groupby(['item','price']].sum()
结果是:
item color selldate howmany cost price
0 001 blue 2020-01-01 1.0 1.0 2.0
1 001 blue 2020-02-01 NaN NaN NaN
2 001 red 2020-01-01 1.0 1.0 2.0
3 001 red 2020-02-01 2.0 2.0 4.0
4 001 yellow 2020-01-01 NaN NaN NaN
5 001 yellow 2020-02-01 2.0 2.0 4.0
6 002 blue 2020-01-01 NaN NaN NaN
7 002 blue 2020-02-01 NaN NaN NaN
8 002 red 2020-01-01 1.0 1.0 2.0
9 002 red 2020-02-01 NaN NaN NaN
10 002 yellow 2020-01-01 3.0 3.0 6.0
11 002 yellow 2020-02-01 NaN NaN NaN
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)