合并3个Dask dataframe转pandas报'Unalignable boolean Series'错误
错误原因
你在loc筛选阶段使用了未合并的原始表(df_drivers、df_races)的列生成布尔索引序列,但筛选的目标对象是三个表join后的新Dask DataFrame,二者的行数量、索引规则完全不匹配,因此触发索引对齐报错。
另外Dask采用懒执行机制,构造运算链时只会做语法校验不会校验逻辑合理性,所以代码定义阶段不会报错,只有调用compute触发实际计算时才会抛出异常。
解决方案
merge操作已经将关联表的所有字段都带入到了合并后的结果中,你直接引用合并后对象自带的字段写筛选条件即可,不需要再访问原始表的列。
修正后的代码如下:
from dask import dataframe as df import pandas as pd pd.set_option("max_rows", None) df_times = df.read_csv("lap_times.csv", blocksize=64000000) df_races = df.read_csv("races.csv",blocksize=64000000) df_drivers = df.read_csv("drivers.csv", blocksize=64000000) # 先把合并后的结果赋值给中间变量,可读性更高 merged_df = df_times.merge(df_drivers, on = "driverId").merge(df_races, on = "raceId")\ .drop(labels = ["dob", "nationality", "milliseconds", "url_x", "url_y", "time_y", "date"], axis = 1) # 筛选条件直接引用合并后df的列,不要用原始表的列 pd1 = merged_df.loc[(merged_df["forename"] == "Sebastian") & (merged_df["surname"] == "Vettel") & (merged_df["year"] == 2018) & (merged_df["round"] == 1), :] # 再执行compute就不会报错了 res = pd1.compute()
内容的提问来源于stack exchange,提问作者S23
相关产品推荐
相关产品推荐

