假设我有一个熊猫数据帧df
:数据标准化
我要计算一个数据帧的逐列平均值。
这是容易的:
df.apply(average)
然后逐列范围内的最高(COL) - 最小(COL)。这又是很容易:
df.apply(max) - df.apply(min)
现在对于我希望通过其列的范围内减去其列的平均值,然后除以每个元素。我不知道该怎么做
任何帮助/指针非常感谢。
假设我有一个熊猫数据帧df
:数据标准化
我要计算一个数据帧的逐列平均值。
这是容易的:
df.apply(average)
然后逐列范围内的最高(COL) - 最小(COL)。这又是很容易:
df.apply(max) - df.apply(min)
现在对于我希望通过其列的范围内减去其列的平均值,然后除以每个元素。我不知道该怎么做
任何帮助/指针非常感谢。
In [92]: df
Out[92]:
a b c d
A -0.488816 0.863769 4.325608 -4.721202
B -11.937097 2.993993 -12.916784 -1.086236
C -5.569493 4.672679 -2.168464 -9.315900
D 8.892368 0.932785 4.535396 0.598124
In [93]: df_norm = (df - df.mean())/(df.max() - df.min())
In [94]: df_norm
Out[94]:
a b c d
A 0.085789 -0.394348 0.337016 -0.109935
B -0.463830 0.164926 -0.650963 0.256714
C -0.158129 0.605652 -0.035090 -0.573389
D 0.536170 -0.376229 0.349037 0.426611
In [95]: df_norm.mean()
Out[95]:
a -2.081668e-17
b 4.857226e-17
c 1.734723e-17
d -1.040834e-17
In [96]: df_norm.max() - df_norm.min()
Out[96]:
a 1
b 1
c 1
d 1
您可以使用apply
了这一点,这是一个有点整洁:
import numpy as np
import pandas as pd
np.random.seed(1)
df = pd.DataFrame(np.random.randn(4,4)* 4 + 3)
0 1 2 3
0 9.497381 0.552974 0.887313 -1.291874
1 6.461631 -6.206155 9.979247 -0.044828
2 4.276156 2.002518 8.848432 -5.240563
3 1.710331 1.463783 7.535078 -1.399565
df.apply(lambda x: (x - np.mean(x))/(np.max(x) - np.min(x)))
0 1 2 3
0 0.515087 0.133967 -0.651699 0.135175
1 0.125241 -0.689446 0.348301 0.375188
2 -0.155414 0.310554 0.223925 -0.624812
3 -0.484913 0.244924 0.079473 0.114448
而且,它与groupby
工作得很好,如果你选择相关的列:
df['grp'] = ['A', 'A', 'B', 'B']
0 1 2 3 grp
0 9.497381 0.552974 0.887313 -1.291874 A
1 6.461631 -6.206155 9.979247 -0.044828 A
2 4.276156 2.002518 8.848432 -5.240563 B
3 1.710331 1.463783 7.535078 -1.399565 B
df.groupby(['grp'])[[0,1,2,3]].apply(lambda x: (x - np.mean(x))/(np.max(x) - np.min(x)))
0 1 2 3
0 0.5 0.5 -0.5 -0.5
1 -0.5 -0.5 0.5 0.5
2 0.5 0.5 0.5 -0.5
3 -0.5 -0.5 -0.5 0.5
如果您不介意导入sklearn
库,我会推荐在this博客上讨论的方法。
import pandas as pd
from sklearn import preprocessing
data = {'score': [234,24,14,27,-74,46,73,-18,59,160]}
df = pd.DataFrame(data)
df
min_max_scaler = preprocessing.MinMaxScaler()
np_scaled = min_max_scaler.fit_transform(df)
df_normalized = pd.DataFrame(np_scaled)
df_normalized
到博客帖子的链接已经死亡。你有工作吗? – marts
@marts完成...! – astrojuanlu
创建单位正态归一化数据的相应方法称为StandardScaler。 – abeboparebop
从稍加修改:Python Pandas Dataframe: Normalize data between 0.01 and 0.99?但一些评论认为这是相关的(对不起,如果认为是转贴,虽然...)
我想在基准或z的,经常百分定制正常化分数不够。有时候我知道人口的可行最大和最小值是什么,因此想要定义它,而不是我的样本,或者不同的中点,或者其他任何东西!这通常对于神经网络的数据重新缩放和标准化非常有用,您可能希望所有输入介于0和1之间,但某些数据可能需要以更加自定义的方式进行缩放......因为百分比和stdevs假设您的样本覆盖人口,但有时我们知道这是不正确的。在热图中可视化数据对我来说也非常有用。所以,我建立了一个自定义函数(用在代码中加入额外步骤,在这里,使其尽可能地易读):
def NormData(s,low='min',center='mid',hi='max',insideout=False,shrinkfactor=0.):
if low=='min':
low=min(s)
elif low=='abs':
low=max(abs(min(s)),abs(max(s)))*-1.#sign(min(s))
if hi=='max':
hi=max(s)
elif hi=='abs':
hi=max(abs(min(s)),abs(max(s)))*1.#sign(max(s))
if center=='mid':
center=(max(s)+min(s))/2
elif center=='avg':
center=mean(s)
elif center=='median':
center=median(s)
s2=[x-center for x in s]
hi=hi-center
low=low-center
center=0.
r=[]
for x in s2:
if x<low:
r.append(0.)
elif x>hi:
r.append(1.)
else:
if x>=center:
r.append((x-center)/(hi-center)*0.5+0.5)
else:
r.append((x-low)/(center-low)*0.5+0.)
if insideout==True:
ir=[(1.-abs(z-0.5)*2.) for z in r]
r=ir
rr =[x-(x-0.5)*shrinkfactor for x in r]
return rr
这将需要在熊猫系列,甚至只是一个列表,并将其归到自己指定的低,中心和高点。还有一个收缩因素!以允许您将数据从端点0和1中缩小(我必须在matplotlib中将色彩图组合在一起时执行此操作):因此,您可能会看到代码的工作方式,但基本上说您具有值[-5,1, 10],但是想要基于-7到7的范围进行归一化(因此大于7的任何数值,我们的“10”被有效地视为7),中点为2,但缩小到适合256 RGB颜色表:
#In[1]
NormData([-5,2,10],low=-7,center=1,hi=7,shrinkfactor=2./256)
#Out[1]
[0.1279296875, 0.5826822916666667, 0.99609375]
它也可以把里面你的数据...这似乎很奇怪,但我发现它有用heatmapping。假设你想要一个更接近0的值而不是hi/low值较深的颜色。你可以热图基于标准化的数据,其中insideout = TRUE:
#In[2]
NormData([-5,2,10],low=-7,center=1,hi=7,insideout=True,shrinkfactor=2./256)
#Out[2]
[0.251953125, 0.8307291666666666, 0.00390625]
所以现在“2”,这是最接近中心,定义为“1”为最高值。
无论如何,我认为我的应用程序是相关的,如果你想以其他方式重新调整数据,可能会有用的应用程序给你。
这是如此明显,我的思想不能接受它:) – jason
有没有办法做到这一点,如果你想正常化的子集?假设“A”和“B”行是您想要与“C”和“D”分开归一化的更大分组因子的一部分。 – Amyunimus
像以前一样选择子集并进行计算。关于如何索引和选择数据,请参阅http://pandas.pydata.org/pandas-docs/stable/indexing.html –