根据一列的多个条件将数据帧分为多个块

时间:2019-10-14 10:06:41

标签: python pandas numpy dataframe split

我有一个大型数据框(+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组合,但是我不确定该怎么做。

1 个答案:

答案 0 :(得分:0)

要将您的DataFrame分成多个“ bin”,将每个 DeviceID 保留在 一个垃圾箱,请采用以下方法:

  • DeviceID 计算 value_counts 。结果是系列 从最多的组开始。
  • 将其转换为 DataFrame 并添加一个由bin编号组成的列, 从 0 循环到 binNo

执行此操作的代码是:

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) ]