팬더의 데이터 정규화
팬더 데이터 프레임이 있다고 가정해 보겠습니다.df
:
데이터 프레임의 열 단위 평균을 계산하려고 합니다.
이는 쉽습니다.
df.apply(average)
열 와이즈 범위 max(col) - min(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
당신이 수입하는 것을 개의치 않는다면.sklearn
도서관, 이 블로그에서 이야기하는 방법을 추천합니다.
import pandas as pd
from sklearn import preprocessing
data = {'score': [234,24,14,27,-74,46,73,-18,59,160]}
cols = data.columns
df = pd.DataFrame(data)
df
min_max_scaler = preprocessing.MinMaxScaler()
np_scaled = min_max_scaler.fit_transform(df)
df_normalized = pd.DataFrame(np_scaled, columns = cols)
df_normalized
사용가능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
약간 수정됨:Python Pandas 데이터프레임: 0.01에서 0.99 사이의 데이터를 정규화합니까? 그러나 일부 의견에서 관련이 있다고 생각했습니다(재게시로 간주된다면 죄송합니다...).
데이터의 정규 백분위수 또는 z-score가 적합하지 않다는 점에서 맞춤형 정규화를 원했습니다.때로는 모집단의 실현 가능한 최대값과 최소값이 무엇인지 알고 있었기 때문에 표본이나 다른 중간점, 또는 무엇이든 정의하고 싶었습니다!이 기능은 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] 값이 있지만 중간점이 2인 -7 ~ 7 범위(7 이상이면 "10"은 7로 효과적으로 처리됨)를 기준으로 정규화하고 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에 가까운 값의 어두운 색을 원한다고 가정합니다.= 내부에 정규화된 데이터를 기반으로 열 지도를 작성할 수 있습니다.참:
#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]
따라서 이제 "1"로 정의되는 중심에 가장 가까운 "2"가 가장 높은 값입니다.
어쨌든, 저는 제 애플리케이션이 유용한 애플리케이션을 제공할 수 있는 다른 방법으로 데이터를 리스케일링하려는 경우에 적합하다고 생각했습니다.
다음은 열 단위로 수행하는 방법입니다.
[df[col].update((df[col] - df[col].min()) / (df[col].max() - df[col].min())) for col in df.columns]
언급URL : https://stackoverflow.com/questions/12525722/normalize-data-in-pandas
'programing' 카테고리의 다른 글
Swift에서 두 버전 문자열 비교 (0) | 2023.09.07 |
---|---|
Swift에서 파일 크기 가져오기 (0) | 2023.09.07 |
jQuery - 입력 필드의 관련 레이블 요소를 선택합니다. (0) | 2023.09.07 |
Java Spring - 누락된 필수 요청 매개 변수를 처리하는 방법 (0) | 2023.09.07 |
Excel 2010 셀에서 특정 문자를 삭제하는 방법 (0) | 2023.09.07 |