Python 使用for循环缩放列

Python 使用for循环缩放列,python,pandas,Python,Pandas,我想用一个函数缩放数据帧中一列的所有值。这是迄今为止的功能: def scale0_1(cname): temp = array(cname) for i in range(len(temp)): value = temp[i]-min(temp)/(max(temp)-min(temp)) temp[i] = value return pd.DataFrame(temp) 下面是一个用于测试函数的示例列: samplecolu

我想用一个函数缩放数据帧中一列的所有值。这是迄今为止的功能:

def scale0_1(cname):
     temp = array(cname)
     for i in range(len(temp)):
         value = temp[i]-min(temp)/(max(temp)-min(temp))
         temp[i] = value
     return pd.DataFrame(temp)
下面是一个用于测试函数的示例列:

samplecolumn = pd.DataFrame([7.0, 15.8, 19.4, 11.4])
但是,当我对数据帧的一列(任何数字列都可以)使用函数时,它只返回原始值,什么也不做。没有错误消息。有人知道如何解决这个问题吗


我非常感谢您的帮助:)

使用熊猫数据帧,您可以对整个列应用操作。这允许您执行以下操作:

def scale0_1(cname):
    scale_factor = min(cname) / (max(cname) - min(cname))
    return cname - scale_factor

这还允许您在整个操作过程中将数据保存在pandas系列或数据帧中,并避免将其转换为数组并返回的额外复杂性。

使用pandas数据帧,您可以将操作应用于整个列。这允许您执行以下操作:

def scale0_1(cname):
    scale_factor = min(cname) / (max(cname) - min(cname))
    return cname - scale_factor

这还允许您在整个操作过程中将数据保存在一个系列或数据帧中,并避免将其转换为数组并返回的额外复杂性。

如果可能,您应该使用矢量化方法,而不是显式迭代行。例如,可以计算列的最大值和最小值。然后,在对序列执行操作时,计算将自动矢量化

df = pd.DataFrame({'A': [7.0, 15.8, 19.4, 11.4]})

col_min = df['A'].min()
col_max = df['A'].max()

df['B'] = (df['A'] - col_min) / (col_max - col_min)
这是一项经常执行的任务,因此您会发现它存在于其他第三方库中。例如,使用
sklearn

from sklearn import preprocessing

min_max_scaler = preprocessing.MinMaxScaler()
df['B'] = min_max_scaler.fit_transform(df['A'])
结果

print(df)

      A         B
0   7.0  0.000000
1  15.8  0.709677
2  19.4  1.000000
3  11.4  0.354839

在可能的情况下,应该使用矢量化方法,而不是显式地迭代行。例如,可以计算列的最大值和最小值。然后,在对序列执行操作时,计算将自动矢量化

df = pd.DataFrame({'A': [7.0, 15.8, 19.4, 11.4]})

col_min = df['A'].min()
col_max = df['A'].max()

df['B'] = (df['A'] - col_min) / (col_max - col_min)
这是一项经常执行的任务,因此您会发现它存在于其他第三方库中。例如,使用
sklearn

from sklearn import preprocessing

min_max_scaler = preprocessing.MinMaxScaler()
df['B'] = min_max_scaler.fit_transform(df['A'])
结果

print(df)

      A         B
0   7.0  0.000000
1  15.8  0.709677
2  19.4  1.000000
3  11.4  0.354839

使用
np.interp

a=df[0].values

np.interp(a, (a.min(), a.max()), (0, +1))
Out[36]: array([0.        , 0.70967742, 1.        , 0.35483871])

使用
np.interp

a=df[0].values

np.interp(a, (a.min(), a.max()), (0, +1))
Out[36]: array([0.        , 0.70967742, 1.        , 0.35483871])


您可以添加一些示例数据吗?看起来您正在查找什么是
cname
?如果是列名,
array(cname)
应该做什么?无法复制您的问题<代码>缩放0_1(样本列)->
6.4、15.3、…=samplecolumn
。帖子没有MCVE,OP声称存在的问题无法复制。因此,没有一个答案能够解决为什么OP的代码不起作用的问题,而只是提出了替代方案。投票结束。你能添加一些样本数据吗?看起来你在寻找什么是
cname
?如果是列名,
array(cname)
应该做什么?无法复制您的问题<代码>缩放0_1(样本列)->
6.4、15.3、…=samplecolumn
。帖子没有MCVE,OP声称存在的问题无法复制。因此,没有一个答案能够解决为什么OP的代码不起作用的问题,而只是提出了替代方案。投票结束。很好,谢谢!我不知道熊猫有那个功能。很好,谢谢!我不知道熊猫有这样的功能。这很好。为了OP的好处,我还想提一下,您可以将数组直接分配给一个系列,即..
df['B']=np.interp(…)
。谢谢您-不知道这个存在@cholz yw:-)快乐的编码这很整洁。为了OP的好处,我还想提一下,您可以将数组直接分配给一个系列,即..
df['B']=np.interp(…)
。谢谢您-不知道这个存在@乔尔兹:祝你好运谢谢你不知道这个存在!谢谢-我不知道这个存在!