代码之家  ›  专栏  ›  技术社区  ›  moshevi

用dask read_拼花法过滤会产生不需要的结果

  •  2
  • moshevi  · 技术社区  · 8 年前

    我正在尝试使用 dask read_parquet 方法和 filters 克瓦格。但是,它有时不能根据给定的条件进行过滤。

    例子: 使用创建和保存数据帧 dates 柱

    import pandas as pd
    import numpy as np
    import dask.dataframe as dd
    
    nums  = range(1,6)
    dates = pd.date_range('2018-07-01', periods=5, freq='1d')
    df = pd.DataFrame({'dates':dates, 'nums': nums})
    
    ddf = dd.from_pandas(df, npartitions=3).to_parquet('test_par', engine = 'fastparquet')
    

    当我阅读并过滤 日期 列 'test_par' 文件夹似乎不起作用

    filters=[('dates', '>', np.datetime64('2018-07-04'))]
    df  = dd.read_parquet('test_par', engine='fastparquet', filters=filters).compute()
    

    正如你在输出中看到的, 2018-07-03 2018-07-04

    +-------+------------+------+
    |       | dates      | nums |
    +-------+------------+------+
    | index |            |      |
    +-------+------------+------+
    | 2     | 2018-07-03 | 3    |
    +-------+------------+------+
    | 3     | 2018-07-04 | 4    |
    +-------+------------+------+
    | 4     | 2018-07-05 | 5    |
    +-------+------------+------+
    

    1 回复  |  直到 8 年前
        1
  •  2
  •   mdurant    8 年前

    这个 filters 关键字是一个行组操作(行组是一组数据行的拼花术语,如数据帧的分区)。它不在分区内进行任何过滤。

    当你使用 过滤器 ,您将排除分区,根据文件中的max/min统计信息,其中 不 给定分区中与给定筛选器匹配的行。例如,如果指定x>5,则将排除最小值为2、最大值为4的分区,但最小值为2、最大值为6的分区将不会包括在内,即使后者只包含满足筛选条件的一些行。

    要筛选数据,您应该仍然使用常规语法

    df[df.dates > np.datetime64('2018-07-04')]
    

    除了过滤器,并将过滤器的使用视为可选优化。如果没有它,dask将不得不读取甚至没有良好数据的分区,然后应用条件,从而导致这些分区没有结果。如果可能,最好不要装载它们。

    推荐文章