Python数据帧:在0.01和0.99之间规范化数据?

Python数据帧:在0.01和0.99之间规范化数据?,python,pandas,dataframe,normalization,Python,Pandas,Dataframe,Normalization,我试图将数据帧中的每个值绑定在0.01和0.99之间 我已使用:.apply(lambda x:(x-x.min())/(x.max()-x.min())成功地将0和1之间的数据标准化,如下所示: df = pd.DataFrame({'one' : ['AAL', 'AAL', 'AAPL', 'AAPL'], 'two' : [1, 1, 5, 5], 'three' : [4,4,2,2]}) df[['two', 'three']].apply(lambda x: (x - x.min

我试图将数据帧中的每个值绑定在0.01和0.99之间

我已使用:
.apply(lambda x:(x-x.min())/(x.max()-x.min())
成功地将0和1之间的数据标准化,如下所示:

df = pd.DataFrame({'one' : ['AAL', 'AAL', 'AAPL', 'AAPL'], 'two' : [1, 1, 5, 5], 'three' : [4,4,2,2]})

df[['two', 'three']].apply(lambda x: (x - x.min()) / (x.max() - x.min()))

df
现在我想将所有值绑定在0.01和0.99之间

这就是我尝试过的:

def bound_x(x):
    if x == 1:
        return x - 0.01
    elif x < 0.99:
        return x + 0.01

df[['two', 'three']].apply(bound_x)
有一个应用程序,呃,用于:

import pandas as pd
df = pd.DataFrame({'one' : ['AAL', 'AAL', 'AAPL', 'AAPL'], 'two' : [1, 1, 5, 5], 'three' : [4,4,2,2]})    
df = df[['two', 'three']].apply(lambda x: (x - x.min()) / (x.max() - x.min()))
df = df.clip(lower=0.01, upper=0.99)
屈服

    two  three
0  0.01   0.99
1  0.01   0.99
2  0.99   0.01
3  0.99   0.01

问题在于

df[['two', 'three']].apply(bound_x)
是指
bound\ux
通过一个类似
df['two']
的序列,然后
如果x==1
需要在布尔上下文中计算
x==1
x==1
是一个类似

In [44]: df['two'] == 1
Out[44]: 
0    False
1    False
2     True
3     True
Name: two, dtype: bool

Python试图将这个序列简化为一个布尔值,
True
False
。Pandas遵循的是。

的NumPy约定,因此我遇到了一个类似的问题,我想要定制标准化,因为我的常规数据百分位数或z分数不够。有时我知道人口的可行最大值和最小值是什么,因此我想定义它,而不是我的样本,或者不同的中点,或者其他任何东西!因此,我构建了一个自定义函数(在这里的代码中使用了额外的步骤以使其尽可能可读):

它还可以把你的数据翻过来。。。这可能看起来很奇怪,但我发现它对热图很有用。假设您希望接近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”,是最高值

无论如何,我认为我的问题与你的问题非常相似,这个函数可能对你有用

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
#In[1]
NormData([-5,2,10],low=-7,center=1,hi=7,shrinkfactor=2./256)
#Out[1]
[0.1279296875, 0.5826822916666667, 0.99609375]
#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]