You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何从Dask DataFrame删除分类?读取分区数据时能否剔除分类?

Dask DataFrame相关问题解答

问题1:如何从Dask DataFrame中删除分类?

得先明确你说的“删除分类”具体指哪种场景,我分两种常见情况给你解决方案:

  • 如果是要删掉DataFrame里的特定分类列(比如从分区Parquet读取后带的hourcustomer这类分区字段列)
    直接用Dask的drop方法就行,和Pandas用法几乎一致。比如要移除hourcustomer这两列:

    df = df.drop(['hour', 'customer'], axis=1)
    

    要是你更清楚需要保留哪些列,也可以通过列选择来间接删除:

    # 筛选出除hour和customer外的所有列
    keep_cols = [col for col in df.columns if col not in ['hour', 'customer']]
    df = df[keep_cols]
    
  • 如果是要移除某列的categorical数据类型(把分类类型转成普通类型)
    astype转成字符串或者其他合适的类型就可以。比如把customer列从分类类型转成字符串:

    df['customer'] = df['customer'].astype(str)
    

    要是只是想清除分类里没用到的类别(优化内存),可以用cat.remove_unused_categories()

    df['customer'] = df['customer'].cat.remove_unused_categories()
    

问题2:读取分区Parquet数据到Dask DataFrame时,是否可以剔除部分分类?

当然可以!不过得看你说的“剔除部分分类”具体是哪种需求,我分两种场景说明:

场景1:不想让分区字段(如hour、customer)出现在最终的DataFrame里

默认情况下,Dask读取分区Parquet时,会自动把路径里的分区键(比如hour=xxcustomer=xx)作为列加到DataFrame中。目前Dask没有直接在读取阶段跳过这些分区键的参数,所以最直接的方式就是读取完成后用问题1里的drop方法删掉这些列。

场景2:只想读取特定分区的数据(剔除其他分区的分类)

如果你的需求是只加载某部分分区的数据(比如只读取customer=a.com或者hour=01的分区),那可以用read_parquetfilters参数来实现,这样Dask只会扫描符合条件的分区,既省内存又快。举两个例子:

  • 只读取customer=a.com的所有数据:
    df = dd.read_parquet(
        './events/24.100/year=*/month=*/day=*/hour=*/customer=*/*.parquet',
        filters=[('customer', '=', 'a.com')]
    )
    
  • 同时筛选hour=01customer=a.com的分区:
    df = dd.read_parquet(
        './events/24.100/year=*/month=*/day=*/hour=*/customer=*/*.parquet',
        filters=[('hour', '=', '01'), ('customer', '=', 'a.com')]
    )
    

需要注意的是,用filters筛选后,hourcustomer这些分区键列还是会出现在DataFrame里,如果不需要的话,读完之后再删掉就行。


内容的提问来源于stack exchange,提问作者j-bennet

火山引擎 最新活动