You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 23:31:07