使用Dask读取7GB CSV时遇NotImplementedError及func未定义问题
问题解决:Dask处理CSV时的标准化错误
错误原因分析
第一个错误
NotImplementedError: dd.DataFrame.apply only supports axis=1:
Dask的dd.DataFrame.apply仅支持**按行(axis=1)**执行函数,而你要对数值列做标准化(按列计算均值、标准差),默认的axis=0(按列)用法在Dask中不被支持。第二个错误
func is not defined:
你按提示添加axis=1后,逻辑完全偏离了按列标准化的需求——此时apply会把每行数据传给函数,而你可能误将lambda替换成了未定义的func,或者修改后的代码逻辑混乱导致变量未定义。
正确解决方案
要实现数值列的z-score标准化((x-均值)/标准差),不需要用apply,直接利用Dask的列运算特性即可,步骤如下:
修正后的代码
import dask.dataframe as dd # 读取7GB CSV文件 df = dd.read_csv('CICIDSs.csv') # 先填充缺失值为0(避免缺失值影响均值/标准差计算) df_filled = df.fillna(0) # 筛选所有非object类型的数值列 features = df_filled.dtypes[df_filled.dtypes != 'object'].index # 计算每列的均值和标准差(Dask延迟计算,无需提前加载全量数据) mean_vals = df_filled[features].mean().persist() # persist缓存统计量,避免重复计算 std_vals = df_filled[features].std().persist() # 执行标准化运算 df_filled[features] = (df_filled[features] - mean_vals) / std_vals print('===== Data Preprocessing =====') # 若需查看结果,用compute()触发实际计算(注意:大文件需确保内存足够,或仅查看前几行df_filled.head()) print(df_filled.compute())
关键说明
- 优先填充缺失值:如果先做标准化,缺失值会导致均值/标准差计算不准确,因此先执行
fillna(0)。 - 用
persist()优化性能:均值和标准差是全局统计量,只需计算一次,persist()会将结果缓存到内存/磁盘,避免后续重复计算。 - Dask延迟计算特性:直接
print(df_filled)只会显示数据结构元信息,需用compute()触发实际运算;若内存不足,建议用df_filled.head()查看前几行结果,而非全量compute()。
内容的提问来源于stack exchange,提问作者Krizel Delos Reyes
相关产品推荐
相关产品推荐

