我有一个相当大的数据集形式的数据集,我想知道如何将数据帧分成两个随机样本(80%和20%)进行训练和测试.
谢谢!
根据经验,每当您set_index使用 Dask 数据帧时,Dask 总是会将具有相同索引的行放入单个分区中,即使这会导致分区严重不平衡。
这是一个演示:
import pandas as pd
import dask.dataframe as dd
users = [1]*1000 + [2]*1000 + [3]*1000
df = pd.DataFrame({'user': users})
ddf = dd.from_pandas(df, npartitions=1000)
ddf = ddf.set_index('user')
counts = ddf.map_partitions(lambda x: len(x)).compute()
counts.loc[counts > 0]
# 500 1000
# 999 2000
# dtype: int64
Run Code Online (Sandbox Code Playgroud)
然而,我在任何地方都找不到这种行为的保证。
我曾尝试自己筛选代码,但放弃了。我相信这些相互关联的函数之一可能包含答案:
当您时set_index,单个索引是否永远不能位于两个不同的分区中?如果不是,那么该财产在什么条件下成立?
赏金:我将向来自信誉良好的来源的答案授予赏金。例如,引用实现来表明该属性必须成立。
这是对dash洗改数据的跟进问题。
我有一个现有的dask数据框df,希望在其中执行以下操作:
df['rand_index'] = np.random.permutation(len(df))
Run Code Online (Sandbox Code Playgroud)
但是,这会产生错误Column assignment doesn't support type ndarray。我试图使用df.assign(rand_index = np.random.permutation(len(df))它给出相同的错误。
这是一个最小的(不是)工作示例:
import pandas as pd
import dask.dataframe as dd
import numpy as np
df = dd.from_pandas(pd.DataFrame({'A':[1,2,3]*10, 'B':[3,2,1]*10}), npartitions=10)
df['rand_index'] = np.random.permutation(len(df))
Run Code Online (Sandbox Code Playgroud)
前面的问题提到了使用,df = df.map_partitions(add_random_column_to_pandas_dataframe, ...)但是我不确定这是否与该特定情况有关。
我尝试过
df['rand_index'] = dd.from_array(np.random.permutation(len_df)),执行没有问题。当我检查时df.head(),似乎已经创建了新列。但是,当我看时df.tail(),rand_index是一堆NaNs。
实际上,只是为了确认我检查了df.rand_index.max().compute()哪个结果小于len(df)-1。所以这可能df.map_partitions是发挥作用的地方,因为我怀疑这是将dask分区的问题。在我的特定情况下,我有80个分区(不涉及示例情况)。