我有一个像这样的数据框架
vid sid pid ts
1 101 123 ...
2 102 125
3 102 125
4 102 125
本质上,vid
是访问者id
,sid
是会话ID
我正在尝试将df(它的长度约为1.7 mil行)划分为长度约为100k的较小数据帧。
for i in range(0, len(df), s):
sdf = df.iloc[i:i+s]
但是,I不想要在会话中间切片数据帧(这样切片部分的最后一行不是最后一行)
例如,下面将会出现问题,因为它对会话idsid
仍然发生的数据帧进行切片
vid sid pid ts
99999 101 144 ...
99999 102 145
100000 102 145
--------------------------
100001 102 145
我正在寻找某种方法来使它这样,如果切断发生在sids
被切断的地方,简单地推动切断,直到侧边不再相同,如
for i in range(0, len(df), s):
if i['sid'][-1] != (i+1)['sid']:
sdf = df.iloc[i:i+s]
else:
# check until sessions are no longer equal
您可以使用dask
import dask.dataframe as dd
ddf = dd.from_pandas(df.set_index('sid'), npartitions=17).reset_index()
注意,分区的数目并不强制总是17
。Dask可能会决定以不同的方式进行分区,以便将索引保留在一个分区中——这正是您想要的。或者你也可以指定一个大小或行数,我认为。
那么你可以得到像
这样的分区ddf.get_partition(3).compute()
或直接使用分布式计算的任务,因为这是它的目的。