판다 : 범주를 숫자로 변환


82

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

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

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

아래와 같이 numpy where 절과 함께 get_dummies를 사용하는 것보다 빠른 방법이 있다고 가정합니다.

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

이것은 'factors'를 사용하여 R에서 수행하기가 다소 쉽기 때문에 pandas가 비슷한 것을 갖기를 바랍니다.


2
의미 cc_index = [0,1,0,2]합니까?
juanpa.arrivillaga

1
물론, 파이썬 0 인덱스 잊어
sachinruk

DataFrame의 범주 형 시리즈 또는 열이 도움이 될 수 있습니다.
min2bro

답변:


143

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

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

DataFrame을 수정하지 않고 단순히 코드를 얻는 경우 :

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

또는 범주 열을 인덱스로 사용하십시오.

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

2
전화 df.cc.cat.codes가 방금 변경된 것 같습니다 df.cc.codes.
Andreas Storvik Strauman

누락 된 값이있는 경우 -1로 인코딩됩니다. 이 경우를 처리하지 않으려면 먼저 문자열로 캐스트 할 수 있습니다. df.cc.astype ( 'str'). astype ( 'category'). cat.codes
Guy s

23

시리즈를 정수 식별자로만 변환하려는 경우 pd.factorize.

이 솔루션은와 달리 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 

11

sklearn라이브러리를 사용하는 경우 LabelEncoder. 와 마찬가지로 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

2

이것을 시도하고 빈도에 따라 숫자로 변환하십시오 (높은 빈도-높은 숫자) :

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

1

모든 열을 Numbers로 변경합니다. 새 열을 만들지 않고 값을 숫자 데이터로 바꿉니다.

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


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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.