用条件对数据框进行分区



我有一个像这样的数据框架

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

或直接使用分布式计算的任务,因为这是它的目的。

相关内容

  • 没有找到相关文章

最新更新