我有一個看起來像這樣的數據框
vid sid pid ts
1 101 123 ...
2 102 125
3 102 125
4 102 125
本質上vid
是一個訪問者id
並且sid
是一個會話 ID
我正在嘗試將長度約為 170 萬行的 df 分區為長度約為 100k 的較小數據幀。
for i in range(0, len(df), s):
sdf = df.iloc[i:i+s]
不過,我不希望切片數據框在一個會話(所以其中一個切片部分最後一行是不是最後的中間。
例如,下面將是一個問題,因為它對會話 idsid
仍在發生的數據幀進行切片
vid sid pid ts
99999 101 144 ...
99999 102 145
100000 102 145
--------------------------
100001 102 145
我正在尋找某種方法來做到這一點,如果切斷發生在sids
切斷的地方,只需推動切斷直到 sid 不再相同,例如
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()
或者直接使用 dask 進行分佈式計算,因為這就是它的目的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句