Development Tip

Pandas 데이터 프레임의 범주 형 데이터 변환

yourdevel 2020. 10. 11. 11:25
반응형

Pandas 데이터 프레임의 범주 형 데이터 변환


이 유형의 데이터 (너무 많은 열)가있는 데이터 프레임이 있습니다.

col1        int64
col2        int64
col3        category
col4        category
col5        category

열은 다음과 같이 보입니다.

Name: col3, dtype: category
Categories (8, object): [B, C, E, G, H, N, S, W]

다음과 같이 열의 모든 값을 정수로 변환하고 싶습니다.

[1, 2, 3, 4, 5, 6, 7, 8]

나는 이것을 하나의 열에 대해 해결했습니다.

dataframe['c'] = pandas.Categorical.from_array(dataframe.col3).codes

이제 데이터 프레임에 이전 'col3'과 새 'c'라는 두 개의 열이 있으며 이전 열을 삭제해야합니다.

그것은 나쁜 습관입니다. 작동하지만 내 데이터 프레임에는 많은 열이 있으며 수동으로 수행하고 싶지 않습니다.

이 비단뱀적이고 영리한 방법은 무엇입니까?


첫째, 범주 형 열을 숫자 코드로 변환하려면 다음을 사용하여 더 쉽게 수행 할 수 있습니다 dataframe['c'].cat.codes.
또한를 사용하여 데이터 프레임에서 특정 dtype을 가진 모든 열을 자동으로 선택할 수 있습니다 select_dtypes. 이렇게하면 자동으로 선택된 여러 열에 위의 작업을 적용 할 수 있습니다.

먼저 예제 데이터 프레임 만들기 :

In [75]: df = pd.DataFrame({'col1':[1,2,3,4,5], 'col2':list('abcab'),  'col3':list('ababb')})

In [76]: df['col2'] = df['col2'].astype('category')

In [77]: df['col3'] = df['col3'].astype('category')

In [78]: df.dtypes
Out[78]:
col1       int64
col2    category
col3    category
dtype: object

그런 다음를 사용 select_dtypes하여 열을 선택한 다음 .cat.codes이러한 각 열에 적용 하면 다음 결과를 얻을 수 있습니다.

In [80]: cat_columns = df.select_dtypes(['category']).columns

In [81]: cat_columns
Out[81]: Index([u'col2', u'col3'], dtype='object')

In [83]: df[cat_columns] = df[cat_columns].apply(lambda x: x.cat.codes)

In [84]: df
Out[84]:
   col1  col2  col3
0     1     0     0
1     2     1     1
2     3     2     0
3     4     0     1
4     5     1     1

이것은 나를 위해 작동합니다.

pandas.factorize( ['B', 'C', 'D', 'B'] )[0]

산출:

[0, 1, 2, 0]

추가 열을 만들고 나중에 삭제하는 것뿐이라면 처음부터 새 열을 사용하십시오.

dataframe = pd.DataFrame({'col1':[1,2,3,4,5], 'col2':list('abcab'),  'col3':list('ababb')})
dataframe.col3 = pd.Categorical.from_array(dataframe.col3).codes

완료되었습니다. 이제 Categorical.from_array더 이상 사용되지 않으므로 Categorical직접 사용하십시오.

dataframe.col3 = pd.Categorical(dataframe.col3).codes

인덱스에서 레이블로 다시 매핑해야하는 경우에도 더 나은 방법이 있습니다.

dataframe.col3, mapping_index = pd.Series(dataframe.col3).factorize()

아래 확인

print(dataframe)
print(mapping_index.get_loc("c"))

여기에서 여러 열을 변환해야합니다. 그래서 제가 사용한 방법 중 하나는 ..

for col_name in df.columns:
    if(df[col_name].dtype == 'object'):
        df[col_name]= df[col_name].astype('category')
        df[col_name] = df[col_name].cat.codes

이것은 모든 문자열 / 객체 유형 열을 범주 형으로 변환합니다. 그런 다음 각 범주 유형에 코드를 적용합니다.


@ Quickbeam2k1, 아래 참조-

dataset=pd.read_csv('Data2.csv')
np.set_printoptions(threshold=np.nan)
X = dataset.iloc[:,:].values

sklearn 사용 enter image description here

from sklearn.preprocessing import LabelEncoder
labelencoder_X=LabelEncoder()
X[:,0] = labelencoder_X.fit_transform(X[:,0])

참고 URL : https://stackoverflow.com/questions/32011359/convert-categorical-data-in-pandas-dataframe

반응형