我有一个大型数据框(+2亿行),格式如下:
DeviceID Date_Time
50135487 2018-03-01 00:00:44
50135487 2018-03-02 01:01:21
50135487 2018-03-01 02:01:58
50135484 2018-03-01 02:01:58
50135484 2018-03-01 02:50:13
50090879 2018-03-01 02:50:13
50090879 2018-03-01 02:50:13
50090860 2018-03-01 02:50:13
50090860 2018-03-01 02:50:13
由于数据框具有大约7700个唯一的“ DeviceID”值,因此我想将大数据框拆分为8个较小的数据框,以便可以更快地对它们进行分析。
我尝试使用numpy
:
import numpy as np
np.array_split(df, 3)
但是它生成了在多个数据帧中都找到特定DeviceID
的数据帧。
我在想解决方案将包含一个if
语句和一个groupby
组合,但是我不确定该怎么做。
答案 0 :(得分:0)
要将您的DataFrame分成多个“ bin”,将每个 DeviceID 保留在 一个垃圾箱,请采用以下方法:
执行此操作的代码是:
binNo = 3 # Number of bins
vc = df.DeviceID.value_counts().rename('cnt')
vc = vc.to_frame().assign(bin=[ i % binNo for i in range(vc.size) ]); vc
对于我的示例数据(稍微更改和扩展了示例),结果是:
cnt bin
50135487 2 0
50135484 2 1
50090860 2 2
50090879 2 0
50090869 1 1
50090850 1 2
50135488 1 0
cnt 是每个 DeviceID 的出现次数,而 bin 是bin DeviceID 的分配。
然后定义一个为bin n 生成 DeviceID 列表的函数:
def genDf(n):
return vc[vc.bin == n].index
并生成DataFrames(容器)的列表,执行:
dfLst = [ df[df.DeviceID.isin(genDf(i))] for i in range(binNo) ]