Python 基于列的多个条件将数据帧拆分为块
我有一个大数据帧(+2亿行),其格式如下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
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) ]