昨天碰见一个问题,处理两千多万条数据。数据的一小部分截图如下:
图中的最后一列是用户行为,有0,1,2,3,4,5这6种行为。图中第一列是用户ID。每个用户有多个行为,比如说ID为1062323的用户就有0,1,2,3这4个行为(图中并未全显示)。
我需要统计每个用户ID(图中第一列)的每种行为(图中最后一列)的次数,并保存起来,最后组成一个数据框。如果是很小的数据集的话,用excel排个序就解决了。但是面对这么多的数据,excel都无法全部打开。
我最初的想法是,在这个数据框中再插入一列'ct',数值全为0,然后利用循环,当用户行为是0时,就把ct这一列对应的值改为1。再用pandas里的groupby函数以id分组对ct求和即可。代码:
循环了1个多小时吧,电脑最后以卡死告终。
我的第二个想法是利用高性能函数query()同时选择ID与行为类型,比如我先统计行为类型为0的那些数据:
我把用户ID保存在一个列表里,通过遍历列表对每个用户ID都进行操作:选出满足:第一,id都等于当前循环id;第二,行为类型都是0,这样的数据框。获得它的行数作为value,把id作为key保存在一个字典里。后续字典还可以转为DataFrame。
我很喜欢我这个想法,但是失败了,电脑还是卡死。
最后我是这样解决的:
经验:
一、处理大数组或数据框时,尽量不要用遍历的方法,要充分使用numpy或pandas里封装好的函数,在这个基础上探索方法。如果不懂,或是对numpy及pandas不熟练,乱用遍历,那可能10小时都得不到结果;
二、学好numpy和pandas非常重要!那些高大上机器学习不一定实用,很有可能把简单问题弄复杂,掌握基础的数据操作是重中之重!
三、有钱把你的PC弄到200G内存的话就可以为所欲为了。
领取专属 10元无门槛券
私享最新 技术干货