在dask中改组数据

sac*_*ruk 7 python dask

这是Subsetting Dask DataFrames的后续问题.我希望在将数据批量发送到ML算法之前对来自dask数据帧的数据进行混洗.

该问题的答案是做以下事情:

for part in df.repartition(npartitions=100).to_delayed():
    batch = part.compute()
Run Code Online (Sandbox Code Playgroud)

然而,即使我要改变批次的内容,我也有点担心它可能不太理想.数据是一个时间序列集,因此数据点在每个分区内高度相关.

理想情况下我喜欢的是:

rand_idx = np.random.choice(len(df), batch_size, replace=False)
batch = df.iloc[rand_idx, :]
Run Code Online (Sandbox Code Playgroud)

哪个适用于熊猫,但不适用于dask.有什么想法吗?

编辑1:潜在的解决方案

我试过了

train_len = int(len_df*0.8)
idx = np.random.permutation(len_df)
train_idx = idx[:train_len]
test_idx = idx[train_len:]
train_df = df.loc[train_idx]
test_df = df.loc[test_idx]
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试这样做,则train_df.loc[:5,:].compute()返回一个124451行数据帧.所以显然使用dask错了.

MRo*_*lin 5

我建议将一列随机数据添加到您的数据框中,然后使用它来设置索引:

df = df.map_partitions(add_random_column_to_pandas_dataframe, ...)
df = df.set_index('name-of-random-column')
Run Code Online (Sandbox Code Playgroud)

  • 我不能简单地为第一行做`df['rand_index'] = np.random.permutation(len(df))`吗? (3认同)