You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Dask运行Python代码遇KeyError及TypeError,求解决方法

问题描述

我正在通过《Fast Python: 大数据集高性能技巧》(2023版)学习Dask,尝试运行书中第241页的示例代码(使用的taxes文件来自美国人口普查局2016年州政府税收年度调查分类表)。已修正文件与书中不一致的列名,但运行时触发错误:

KeyError: 'Cannot index with non-boolean dask Series. Try passing computed values instead (e.g. ddf.loc[iindexer.compute()])'

按照错误提示使用compute方法后,又出现新错误:TypeError: 'Index...' is an invalid key。

相关代码如下:

import dask.dataframe as dd
import numpy as np

fname = "taxes.csv"

taxes = dd.read_csv(fname)
taxes["Amount"] = (
    taxes["Amount in Thousands"].str.replace(",", "").replace("X", np.nan).astype(float)
)
taxes["Tax Type"] = taxes["Tax Type"].astype("category").cat.as_known()
pivot = taxes.pivot_table(index="State", columns="Tax Type", values="Amount")

has_property_info = pivot[~pivot["Property Taxes"].isna()].index
pivot_clean = pivot.loc[has_property_info]
frac_property = pivot_clean["Property Taxes"] / pivot_clean["Total Taxes"]
解决方案

问题根源在于Dask DataFrame的索引逻辑和Pandas存在差异,不能直接用Dask索引对象做切片,也不能直接把计算后的Pandas Index传给loc。这里有两种靠谱的解决方式:

方式一:直接用布尔掩码过滤(推荐)

跳过提取索引的步骤,直接用布尔条件筛选,这是Dask最适配的过滤方式,无需提前计算数据集的索引:

# 替换原代码中has_property_info和pivot_clean的两行
pivot_clean = pivot[~pivot["Property Taxes"].isna()]

方式二:通过计算后的索引值筛选

如果一定要基于索引过滤,需要先把有效索引计算成具体的列表,再用isin方法匹配:

# 计算出所有有Property Taxes数据的州名列表
valid_states = pivot[~pivot["Property Taxes"].isna()].index.compute()
# 用isin筛选符合条件的行
pivot_clean = pivot[pivot.index.isin(valid_states)]

之前用pivot.loc[has_property_info.compute()]报错,是因为Dask的loc不支持直接传入Pandas Index对象,必须用isin来做成员判断。

内容的提问来源于stack exchange,提问作者stray_dog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 00:40:11