使用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
相关产品推荐
相关产品推荐

