簡體   English   中英

轉換熊貓數據框中的分類數據

[英]Convert categorical data in pandas dataframe

我有一個包含此類數據的數據框(列太多):

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
此外,可以使用select_dtypes自動選擇數據框中具有特定 dtype 的所有列。 這樣,您可以將上述操作應用於多個自動選擇的列。

首先制作一個示例數據框:

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.

要將 Dataframe 中的所有列轉換為數值數據:

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

這里的答案似乎已經過時了。 Pandas 現在有一個factorize()函數,您可以創建如下類別:

df.col.factorize() 

函數簽名:

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

將分類變量轉換為虛擬/指示變量的最簡單方法之一是使用 pandas 提供的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]

Factorize 會將列中每個唯一的分類數據變成一個特定的數字(從 0 到無窮大)。

@Quickbeam2k1,見下文 -

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM