从 Pandas Python 数据帧重新缩放到 (0,1) 某些列

Rescaling to (0,1) certain columns from Pandas Python dataframe

我有以下类型的数据框:

  Channel   Region  Fresh   Milk    Grocery Frozen  Detergents_Paper    Delicassen
0   2         3     12669   9656    7561    214        2674             1338
1   2         3     7057    9810    9568    1762       3293             1776
2   2         3     6353    8808    7684    2405       3516             7844
3   1         3     13265   1196    4221    6404       507              1788
4   2         3     22615   5410    7198    3915       1777             5185

我想做两件事:

1) 能够仅重新缩放某些列而不是所有列,以便它们在 0,1 之间。我只想 select 某些列,但不是按名称而是按位置。想象一下,我想改变 200 并且不想写所有这些。

我试过的代码是:

df /= df.max() 

但它使所有列都在 (0,1) 之间,而不仅仅是我想要的列。而且我找不到只 select 其中一部分的方法。

2) 我还想重新缩放列,但不是在它们之间,我的意思是我想只为牛奶制作一个秤,另一个只为冷冻的,例如。

我想重新缩放每一个,例如在 100 之间划分,因为它们太大了,但也许对于另一列我想在 10 之间划分,因为 100 太多了。我该怎么做?

对于 1,您可以 select 像这样的列列表:

df[['Milk','Frozen','Grocery']]

因此,要仅重新缩放这三列,请使用:

df[['Milk','Frozen','Grocery']] -= df[['Milk','Frozen','Grocery']].min()
df[['Milk','Frozen','Grocery']] /= df[['Milk','Frozen','Grocery']].max()

如果这是你的第二个问题的意思,这个方法已经独立地缩放你的列。

编辑:

如果你想 select 数据框的前 200 列,你可以使用 df.columns 它给你列的列表:

df[df.columns[:200]] -= df[df.columns[:200]].min()
df[df.columns[:200]] /= df[df.columns[:200]].max()

数据帧 pandas 上的 max 方法 returns 每列最大值的列表。因此,如果您使用上面的代码,则每列中的最大值都将完全等于 1。

如果您不想将它除以每列的最大值,而是第一列除以 n1,第二列除以 n2,您可以使用相同的表示法:

df[df.columns[:4]] /= [n1,n2,n3,n4]

这是一个针对单个列的解决方案,它实际上在 0,1 范围内重新缩放:

a = [5,15,25,35,45,50,55,65,75,85,95]
df = pd.DataFrame(data=a, columns=['a'])
df['rescale'] = (df['a'] - min(df['a'])) / (max(df['a']) - min(df['a']))

也是一个numpy方法:

import numpy as np
rescale = (a - np.min(a))/np.ptp(a)