Python-groupby奇怪地表现为“类别”类型

问题描述

我正在对一些脚本进行故障排除,这些脚本处理大量记录,并偶尔引发内存错误。脚本在笔记本电脑上可以正常工作,但是当我们尝试将其移植到服务器时,这种内存行为就开始了。通过不再需要在数据帧上执行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 (将#修改为@)