programing

판다: 범주를 숫자로 변환합니다.

codeshow 2023. 8. 15. 11:48
반응형

판다: 범주를 숫자로 변환합니다.

다음과 같은 국가의 데이터 프레임이 있다고 가정합니다.

cc | temp
US | 37.0
CA | 12.0
US | 35.0
AU | 20.0

국가를 '원핫 인코딩'으로 변환하는 pd.get_dummies 함수가 있다는 것을 알고 있습니다.하지만, 나는 그것들을 인덱스로 변환하여 내가 얻을 수 있도록 하고 싶습니다.cc_index = [1,2,1,3]대신.

아래와 같이 numpywhere 절과 함께 get_dummies를 사용하는 것보다 더 빠른 방법이 있다고 생각합니다.

[np.where(x) for x in df.cc.get_dummies().values]

이것은 R에서 '인자'를 사용하는 것이 다소 더 쉬우므로 판다도 비슷한 것을 가지고 있기를 바랍니다.

먼저 열의 유형을 변경합니다.

df.cc = pd.Categorical(df.cc)

이제 데이터는 비슷해 보이지만 범주형으로 저장됩니다.범주 코드를 캡처하려면 다음을 수행합니다.

df['code'] = df.cc.cat.codes

이제 다음이 있습니다.

   cc  temp  code
0  US  37.0     2
1  CA  12.0     1
2  US  35.0     2
3  AU  20.0     0

데이터 프레임을 수정하지 않고 코드만 가져오는 경우:

df.cc.astype('category').cat.codes

또는 범주형 열을 인덱스로 사용합니다.

df2 = pd.DataFrame(df.temp)
df2.index = pd.CategoricalIndex(df.cc)

영상 시리즈를 정수 식별자로만 변환하려는 경우 를 사용할 수 있습니다.

이 솔루션을 메모합니다.pd.Categorical가 알파벳 순으로 정렬되지 않습니다.그래서 첫 번째 국가가 배정될 것입니다.0시작하려는 경우1상수를 추가할 수 있습니다.

df['code'] = pd.factorize(df['cc'])[0] + 1

print(df)

   cc  temp  code
0  US  37.0     1
1  CA  12.0     2
2  US  35.0     1
3  AU  20.0     3

알파벳 순으로 정렬하려면 다음을 지정합니다.sort=True:

df['code'] = pd.factorize(df['cc'], sort=True)[0] + 1 

만약 당신이 도서관을 사용하고 있다면, 당신은 사용할 수 있습니다.pd.Categorical입력 문자열은 인코딩 전에 알파벳 순으로 정렬됩니다.

from sklearn.preprocessing import LabelEncoder

LE = LabelEncoder()
df['code'] = LE.fit_transform(df['cc'])

print(df)

   cc  temp  code
0  US  37.0     2
1  CA  12.0     1
2  US  35.0     2
3  AU  20.0     0

한 줄 코드:

df[['cc']] = df[['cc']].apply(lambda col:pd.Categorical(col).codes)

이것은 또한 당신이 가지고 있는 경우에도 작동합니다.list_of_columns:

df[list_of_columns] = df[list_of_columns].apply(lambda col:pd.Categorical(col).codes)

게다가, 만약 당신이 계속하고 싶다면.NaN대체를 적용할 수 있는 값:

df[['cc']] = df[['cc']].apply(lambda col:pd.Categorical(col).codes).replace(-1,np.nan)

주파수(고주파-고주파)를 기준으로 숫자로 변환해 보십시오.

labels = df[col].value_counts(ascending=True).index.tolist()
codes = range(1,len(labels)+1)
df[col].replace(labels,codes,inplace=True)

열을 숫자로 변경합니다.새 열은 생성되지 않고 값만 숫자 데이터로 바꿉니다.

def characters_to_numb(*args):
    for arg in args:
        df[arg] = pd.Categorical(df[arg])
        df[arg] = df[arg].cat.codes
    return df

언급URL : https://stackoverflow.com/questions/38088652/pandas-convert-categories-to-numbers

반응형