传递numpy.float64参数给pandas.Series.apply()报错,求解决方案
问题解决:Series.apply()参数传递错误及优化方案
错误原因
你遇到的TypeError和numpy.float64无关,问题出在**Series.apply()的参数传递方式**上:
apply()的args参数要求传入一个可迭代对象(比如元组),用来传递给自定义函数的额外参数- 你直接写
apply(normalization, pop_mean, pop_sd),会把pop_mean当成args参数传入,而pop_mean是单个numpy.float64,不是可迭代对象,所以触发"Value after * must be an iterable"错误
另外,voting_df['pop_estimate'].mean()和.std()本身就是pandas实现的方法,返回numpy.float64是正常行为,强制用pandas版本也解决不了这个问题——因为问题根本不在这。
修复方案
方案1:正确使用args参数
把额外参数打包成元组传给args:
voting_df['pop_estimate'] = voting_df['pop_estimate'].apply(normalization, args=(pop_mean, pop_sd))
方案2:用lambda函数包装
通过lambda直接传递参数,写法更直观:
voting_df['pop_estimate'] = voting_df['pop_estimate'].apply(lambda x: normalization(x, pop_mean, pop_sd))
方案3:推荐使用向量化操作(更高效)
apply()本质是逐行循环,效率远低于pandas的向量化运算。直接对整个Series做数学运算即可,完全不需要自定义函数和apply:
voting_df['pop_estimate'] = (voting_df['pop_estimate'] - pop_mean) / pop_sd
这种方式不仅代码更简洁,运行速度也比apply()快很多,尤其当数据量较大时优势明显。
内容的提问来源于stack exchange,提问作者Chris Kouts
相关产品推荐
相关产品推荐

