Python Pandas Dataframe:规范化数据在 0.01 和 0.99 之间?
Python Pandas Dataframe: Normalize data between 0.01 and 0.99?
我试图将数据框中的每个值都限制在 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)
df
但是我收到以下错误:
ValueError: ('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', u'occurred at index two')
有一个应用程序,错误 clip method,用于:
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_x
获得了像 df['two']
这样的系列,然后 if 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 遵循 raising an error when you try to convert a Series (or array) to a bool.
的 NumPy 约定
所以我有一个类似的问题,我想要自定义规范化,因为我的数据或 z 分数的常规百分位数是不够的。有时我知道总体的可行最大值和最小值是多少,因此想要定义它而不是我的样本,或不同的中点,或其他什么!所以我构建了一个自定义函数(在此处的代码中使用了额外的步骤以使其尽可能可读):
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
这将采用 pandas 系列,甚至只是一个列表,并将其标准化为您指定的低点、中心点和高点。还有一个收缩因素!允许您将数据从 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]
它还可以将您的数据翻转过来...这可能看起来很奇怪,但我发现它对热图很有用。假设您想要更深的颜色来表示更接近 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”是最高值。
无论如何,我认为我的问题与您的问题非常相似,这个功能可能对您有用。
我试图将数据框中的每个值都限制在 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)
df
但是我收到以下错误:
ValueError: ('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', u'occurred at index two')
有一个应用程序,错误 clip method,用于:
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_x
获得了像 df['two']
这样的系列,然后 if 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 遵循 raising an error when you try to convert a Series (or array) to a bool.
所以我有一个类似的问题,我想要自定义规范化,因为我的数据或 z 分数的常规百分位数是不够的。有时我知道总体的可行最大值和最小值是多少,因此想要定义它而不是我的样本,或不同的中点,或其他什么!所以我构建了一个自定义函数(在此处的代码中使用了额外的步骤以使其尽可能可读):
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
这将采用 pandas 系列,甚至只是一个列表,并将其标准化为您指定的低点、中心点和高点。还有一个收缩因素!允许您将数据从 0 和 1 缩小(在 matplotlib 中组合颜色图时我必须这样做:
#In[1]
NormData([-5,2,10],low=-7,center=1,hi=7,shrinkfactor=2./256)
#Out[1]
[0.1279296875, 0.5826822916666667, 0.99609375]
它还可以将您的数据翻转过来...这可能看起来很奇怪,但我发现它对热图很有用。假设您想要更深的颜色来表示更接近 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”是最高值。
无论如何,我认为我的问题与您的问题非常相似,这个功能可能对您有用。