[python] Pandas 데이터 프레임의 열 정규화

각 열의 값 범위가 다른 팬더에 데이터 프레임이 있습니다. 예를 들면 :

df :

A     B   C
1000  10  0.5
765   5   0.35
800   7   0.09

각 값이 0과 1 사이 인이 데이터 프레임의 열을 어떻게 정규화 할 수 있는지 아십니까?

내 원하는 출력은 다음과 같습니다.

A     B    C
1     1    1
0.765 0.5  0.7
0.8   0.7  0.18(which is 0.09/0.5)



답변

sklearn 패키지 및 관련 전처리 유틸리티를 사용하여 데이터를 정규화 할 수 있습니다.

import pandas as pd
from sklearn import preprocessing

x = df.values #returns a numpy array
min_max_scaler = preprocessing.MinMaxScaler()
x_scaled = min_max_scaler.fit_transform(x)
df = pd.DataFrame(x_scaled)

자세한 내용은 데이터 전처리 : 기능을 범위로 확장 하는 방법에 대한 scikit-learn 문서 를 참조하세요 .


답변

Pandas 를 사용하는 쉬운 방법 : (여기서는 평균 정규화를 사용하고 싶습니다)

normalized_df=(df-df.mean())/df.std()

최소-최대 정규화를 사용하려면 :

normalized_df=(df-df.min())/(df.max()-df.min())

편집 : 일부 문제를 해결하려면 Pandas가 위 코드에서 자동으로 colomn-wise 함수를 적용한다고 말할 필요가 있습니다.


답변

이 게시물을 기반으로 : /stats/70801/how-to-normalize-data-to-0-1-range

다음을 수행 할 수 있습니다.

def normalize(df):
    result = df.copy()
    for feature_name in df.columns:
        max_value = df[feature_name].max()
        min_value = df[feature_name].min()
        result[feature_name] = (df[feature_name] - min_value) / (max_value - min_value)
    return result

당신의 가치가 부정적인지 긍정적인지에 대해 걱정할 필요가 없습니다. 그리고 값은 0과 1 사이에 잘 ​​분산되어야합니다.


답변

문제는 실제로 열에 작용하는 간단한 변환입니다.

def f(s):
    return s/s.max()

frame.apply(f, axis=0)

또는 더 간결하게 :

   frame.apply(lambda x: x/x.max(), axis=0)


답변

sklearn 패키지 사용을 좋아한다면 다음과 같이 pandas를 사용하여 열 및 인덱스 이름을 유지할 수 있습니다 loc.

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
scaled_values = scaler.fit_transform(df)
df.loc[:,:] = scaled_values


답변

단순함은 아름답습니다 :

df["A"] = df["A"] / df["A"].max()
df["B"] = df["B"] / df["B"].max()
df["C"] = df["C"] / df["C"].max()


답변

정규화하려는 열 목록을 만들 수 있습니다.

column_names_to_normalize = ['A', 'E', 'G', 'sadasdsd', 'lol']
x = df[column_names_to_normalize].values
x_scaled = min_max_scaler.fit_transform(x)
df_temp = pd.DataFrame(x_scaled, columns=column_names_to_normalize, index = df.index)
df[column_names_to_normalize] = df_temp

Pandas Dataframe은 이제 원하는 열에서만 정규화됩니다.


그러나 반대로 원하는 경우 정규화 하지 않으려 는 열 목록을 선택하고 모든 열 목록을 만들고 원하지 않는 열을 제거하면됩니다.

column_names_to_not_normalize = ['B', 'J', 'K']
column_names_to_normalize = [x for x in list(df) if x not in column_names_to_not_normalize ]