从`dask.DataFrame`中切出几行

5
通常,在处理大型 dask.DataFrame 时,仅抓取一些行以测试所有后续操作将非常有用。
目前,根据 Slicing a Dask Dataframe,此功能不受支持。
我希望使用 head 来实现相同的功能(因为该命令受支持),但它返回一个常规的 pandas DataFrame。
我还尝试了 df[:1000],它可以执行,但生成的输出与 Pandas 的预期输出不同。
是否有办法从 dask.DataFrame 中获取前 1000 行?
2个回答

8
如果您的数据帧具有合理分区的索引,那么我建议使用.loc
small = big.loc['2000':'2005']

如果您想保持相同数量的分区,可以考虑进行抽样。
small = big.sample(frac=0.01)

如果您只需要一个分区,可以尝试使用get_partition
small = big.get_partition(0)

你也可以随时使用to_delayedfrom_delayed来构建自己的定制解决方案。http://dask.pydata.org/en/latest/dataframe-create.html#dask-delayed 更一般地说,Dask.dataframe不会保留每个分区的行数,因此“给我1000行”的具体问题变得非常难以回答。回答“给我1月份的所有数据”或“给我第一个分区”的问题要容易得多。

谢谢,获取分区对我的目的已经足够好了。相比于Pandas,您认为df[:1000]是否做得正确? - Stefan van der Walt
Pandas的开发人员建议不要使用df[:1000],而是明确使用.loc.iloc。你可能指的是.iloc,但在dask.dataframe中不支持它。 - MRocklin
2
这种行为在文档(http://pandas.pydata.org/pandas-docs/stable/indexing.html#slicing-ranges)中有描述,并且至少在一个S/O答案中被Wes提到。因此,我怀疑在这里默默地做一些与Pandas不同的事情会让用户感到困惑。 - Stefan van der Walt

3
您可以将初始DataFrame重新分区为任意数量的分区。如果您想要每个分区包含1000行:

npart = round(len(df)/1000)
parted_df = df.repartition(npartitions=npart)

然后只需调用您想要的分区即可:
first_1000_rows = parted_df.partitions[0]

请注意,除非您的初始数据框中的行数是1000的倍数,否则您将无法获得 恰好 1000 行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接