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(…)
。谢谢您-不知道这个存在@乔尔兹:祝你好运谢谢你不知道这个存在!谢谢-我不知道这个存在!