판다 데이터 프레임에서 범주형 데이터 변환
다음 유형의 데이터가 있는 데이터 프레임이 있습니다(열이 너무 많습니다).
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 하기 »
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
수동 일치를 사용하면 됩니다.
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
'programing' 카테고리의 다른 글
Spring Boot이 application.yml config를 로드하지 않습니다. (0) | 2023.07.16 |
---|---|
data.table에서 이름으로 열을 삭제하려면 어떻게 해야 합니까? (0) | 2023.07.16 |
OOP 및 C의 인터페이스 (0) | 2023.07.16 |
NS 레이아웃 제약 조건은 애니메이션으로 제작할 수 있습니까? (0) | 2023.07.16 |
파이썬에서 모든 크기의 빈 목록을 얻으려면 어떻게 해야 합니까? (0) | 2023.07.16 |