programing

판다 데이터 프레임에서 범주형 데이터 변환

bestprogram 2023. 7. 16. 13:44

판다 데이터 프레임에서 범주형 데이터 변환

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

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

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

내가 하는 일은, 나는replace가치.

이런 식으로...

df['col'].replace(to_replace=['category_1', 'category_2', 'category_3'], value=[1, 2, 3], inplace=True)

이런 식으로, 만약에.col열에 범주형 값이 있고 숫자 값으로 대체됩니다.

데이터 세트 데이터의 C열에 있는 범주형 데이터를 변환하려면 다음 작업을 수행해야 합니다.

from sklearn.preprocessing import LabelEncoder 
labelencoder= LabelEncoder() #initializing an object of class LabelEncoder
data['C'] = labelencoder.fit_transform(data['C']) #fitting and transforming the desired categorical column.

데이터 프레임의 모든 열을 숫자 데이터로 변환하는 방법

df2 = df2.apply(lambda x: pd.factorize(x)[0])

여기서의 답은 구식인 것 같습니다.Pandas에는 이제 기능이 있으며 다음과 같은 범주를 만들 수 있습니다.

df.col.factorize() 

함수 서명:

pandas.factorize(values, sort=False, na_sentinel=- 1, size_hint=None)

범주형 변수를 더미/표시 변수로 변환하는 가장 간단한 방법 중 하나는 팬더가 제공하는 get_dummies를 사용하는 것입니다.예를 들어 데이터가 있다고 가정해 보겠습니다.sex는 범주형 값(남성 및 여성)이며, 이 값을 더미/모뎀으로 변환해야 합니다. 여기서는 이 작업을 수행하는 방법을 설명합니다.

tranning_data = pd.read_csv("../titanic/train.csv")
features = ["Age", "Sex", ] //here sex is catagorical value
X_train = pd.get_dummies(tranning_data[features])
print(X_train)

Age Sex_female Sex_male
20    0          1
33    1          0
40    1          0
22    1          0
54    0          1

사용할 수 있습니다..replace다음과 같이 표시됩니다.

df['col3']=df['col3'].replace(['B', 'C', 'E', 'G', 'H', 'N', 'S', 'W'],[1,2,3,4,5,6,7,8])

또는.map:

df['col3']=df['col3'].map({1: 'B', 2: 'C', 3: 'E', 4:'G', 5:'H', 6:'N', 7:'S', 8:'W'})
categorical_columns =['sex','class','deck','alone']

for column in categorical_columns:
     df[column] = pd.factorize(df[column])[0]

요인화는 열의 각 고유 범주형 데이터를 특정 숫자(0부터 무한대까지)로 만듭니다.

@퀵빔 2k1, 아래 참조 -

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])

아래와 같이 코드를 줄일 수 있습니다.

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

f['col1'] =f['col1'].astype('category').cat.codes
f['col2'] =f['col2'].astype('category').cat.codes
f['col3'] =f['col3'].astype('category').cat.codes

f

enter image description here

수동 일치를 사용하면 됩니다.

dict = {'Non-Travel':0, 'Travel_Rarely':1, 'Travel_Frequently':2}

df['BusinessTravel'] = df['BusinessTravel'].apply(lambda x: dict.get(x))

특정 열의 경우, 주문이 상관없으면 다음을 사용합니다.

df['col1_num'] = df['col1'].apply(lambda x: np.where(df['col1'].unique()==x)[0][0])

주문에 관심이 있는 경우 목록으로 지정하고 다음을 사용합니다.

df['col1_num'] = df['col1'].apply(lambda x: ['first', 'second', 'third'].index(x))

당신은 이런 것을 사용할 수 있습니다.

df['Grade'].replace(['A', 'B', 'C'], [0, 1, 2], inplace=True)

복사를 수행하지 않으려면 inplace 인수를 사용합니다.열을 선택하고 해당 열의 구별을 원하는 열로 바꿉니다.

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