Dask索引行为与pandas不同,无法像列一样用str方法过滤?
问题结论
这个问题既不是Dask的固有特性,也不是多分区场景的必然限制,属于Dask当前对索引字符串方法返回值的适配不完善导致的问题,不存在用法遗漏。
报错原因
对Dask DataFrame的普通列使用str方法时,返回的布尔掩码会被Dask正确识别为行过滤条件;但对索引执行str方法返回的布尔序列,Dask会错误地将其当做索引值切片的输入,尝试和分区索引的上下界做大小比较,因此触发了bool类型和字符串类型比较的TypeError。
可行解决方案
两种方案都没有额外跨分区开销,性能损失可以忽略:
- 使用
map_partitions在每个分区内直接调用pandas原生逻辑,改动最小:
result = ddf2.map_partitions( lambda partition: partition[partition.index.str.endswith("a")] ).compute()
- 先把索引重置为普通列,过滤完成后再恢复索引,适合后续需要继续操作索引的场景:
result = ddf2.reset_index()\ [lambda df: df.a.str.endswith("a")]\ .set_index("a")\ .compute()
目前Dask还没有原生支持索引字符串掩码的直接过滤逻辑,上述两种都是生产环境常用的绕过方案,可以放心使用。
内容的提问来源于stack exchange,提问作者Joran Dox
相关产品推荐
相关产品推荐

