Pandas中使用函数实现归一化时出现NaN值的解决方法
问题原因
你得到NaN的核心问题是**apply的使用方式错误**:当对df["age"](一个Series)调用apply(normalizar)时,apply会把Series里的每一个单独数值(比如48、7、62)逐个传给normalizar函数。此时函数里的x是单个数字,x.min()和x.max()都是这个数字本身,计算(x - xmin)/(xmax - xmin)就会变成0/0,结果自然是NaN。
解决方案
以下三种方法任选其一即可:
方法1:直接把整个列传给你的函数(推荐)
你的normalizar函数本来就是为处理数组/Series设计的,不需要用apply,直接传入整个列就行:
import pandas as pd import numpy as np def normalizar(x): x = np.array(x) xmin = x.min() xmax = x.max() return (x - xmin) / (xmax - xmin) df = pd.DataFrame({"age": [48,7,62,48,51]}) df["age_n"] = normalizar(df["age"]) print(df)
输出结果:
age age_n 0 48 0.745455 1 7 0.000000 2 62 1.000000 3 48 0.745455 4 51 0.800000
方法2:修改函数适配单个元素,提前计算全局min/max
如果一定要用apply,可以先算出整个age列的最小值和最大值,再让函数接收单个元素进行计算:
import pandas as pd import numpy as np df = pd.DataFrame({"age": [48,7,62,48,51]}) xmin = df["age"].min() xmax = df["age"].max() def normalizar_single(x): return (x - xmin) / (xmax - xmin) df["age_n"] = df["age"].apply(normalizar_single) print(df)
方法3:用sklearn的MinMaxScaler(工业级常用方法)
如果是做机器学习相关的归一化,推荐用sklearn自带的MinMaxScaler,更简洁规范:
import pandas as pd from sklearn.preprocessing import MinMaxScaler df = pd.DataFrame({"age": [48,7,62,48,51]}) scaler = MinMaxScaler() # 注意fit_transform需要传入二维数组,所以用df[["age"]]而不是df["age"] df["age_n"] = scaler.fit_transform(df[["age"]]) print(df)
内容的提问来源于stack exchange,提问作者Another.Chemist
相关产品推荐
相关产品推荐

