Python 基于列的多个条件将数据帧拆分为块

Python 基于列的多个条件将数据帧拆分为块,python,pandas,numpy,dataframe,split,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 201

我有一个大数据帧(+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)
但它产生了数据帧,其中在多个数据帧中可以找到特定的
设备ID


我想象这个解决方案将包括一个
if
语句和
groupby
组合,但我不知道该怎么做。

将您的数据帧拆分为多个“存储箱”,将每个设备ID保留在 对于单个箱子,请采用以下方法:

  • 计算设备ID的值\u计数。结果是一系列的 从众多的团体开始
  • 将其转换为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 此设备ID的分配

然后为bin n定义设备ID的函数生成列表:

要生成数据帧(箱)列表,请执行:

dfLst = [ df[df.DeviceID.isin(genDf(i))] for i in range(binNo) ]

为什么您认为拆分它可以让您更快地运行分析?我只能想象,如果您使用多处理器,每个CPU核心都在并行执行分析,那么这种情况是正确的使用更多的itertools。。。。检查是否拆分它,因为我在使用
pd.to_datetime
命令转换时间戳时遇到问题,然后使用此格式将格式化的日期和时间拆分为两个不同的列:
%d/%m/%Y
%H:%m:%S
进行转换需要很多时间。@renaldomon我建议您跳过
pd.to_datetime
并改用
df[“Date\u Time”].astype(“M8”)
。然后您可以查看或查找核心外数据帧。这些工具将为您管理拆分,这样您就可以运行groupby了。
dfLst = [ df[df.DeviceID.isin(genDf(i))] for i in range(binNo) ]