Gấu trúc: chuyển đổi danh mục thành số


82

Giả sử tôi có một khung dữ liệu với các quốc gia như sau:

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

Tôi biết rằng có một chức năng pd.get_dummies để chuyển đổi các quốc gia thành 'các mã hóa phổ biến'. Tuy nhiên, tôi muốn chuyển đổi chúng thành các chỉ số để thay vào đó tôi sẽ nhận được cc_index = [1,2,1,3].

Tôi giả định rằng có một cách nhanh hơn là sử dụng get_dummies cùng với mệnh đề numpy where như được hiển thị bên dưới:

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

Điều này có phần dễ thực hiện hơn trong R bằng cách sử dụng 'factor', vì vậy tôi hy vọng gấu trúc có thứ gì đó tương tự.


2
Ý bạn là cc_index = [0,1,0,2]?
juanpa.arrivillaga

1
chắc chắn, quên về python 0 index
sachinruk

Chuỗi phân loại hoặc các cột trong DataFrame có thể hữu ích.
min2bro

Câu trả lời:


143

Đầu tiên, hãy thay đổi loại cột:

df.cc = pd.Categorical(df.cc)

Bây giờ dữ liệu trông tương tự nhưng được lưu trữ phân loại. Để nắm bắt các mã danh mục:

df['code'] = df.cc.cat.codes

Bây giờ bạn có:

   cc  temp  code
0  US  37.0     2
1  CA  12.0     1
2  US  35.0     2
3  AU  20.0     0

Nếu bạn không muốn sửa đổi DataFrame của mình mà chỉ cần lấy mã:

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

Hoặc sử dụng cột phân loại làm chỉ mục:

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

2
Cuộc gọi df.cc.cat.codesdường như đã thay đổi thành chỉ df.cc.codes?
Andreas Storvik Strauman

Lưu ý rằng nếu bạn thiếu giá trị, chúng sẽ được mã hóa thành -1. Nếu bạn muốn tránh xử lý trường hợp này, trước tiên bạn có thể ép kiểu thành chuỗi: df.cc.astype ('str'). Astype ('category'). Cat.codes
Guy s

23

Nếu bạn chỉ muốn chuyển đổi chuỗi của mình thành số nhận dạng số nguyên, bạn có thể sử dụng pd.factorize.

Lưu ý rằng giải pháp này, không giống như pd.Categorical, sẽ không sắp xếp theo thứ tự bảng chữ cái. Vì vậy, quốc gia đầu tiên sẽ được chỉ định 0. Nếu bạn muốn bắt đầu từ đó 1, bạn có thể thêm một hằng số:

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

Nếu bạn muốn sắp xếp theo thứ tự bảng chữ cái, hãy chỉ định sort=True:

df['code'] = pd.factorize(df['cc'], sort=True)[0] + 1 

11

Nếu bạn đang sử dụng sklearnthư viện, bạn có thể sử dụng LabelEncoder. Giống như pd.Categorical, các chuỗi đầu vào được sắp xếp theo thứ tự bảng chữ cái trước khi mã hóa.

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

Hãy thử điều này, chuyển đổi thành số dựa trên tần suất (tần suất cao - số cao):

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

1

Sẽ thay đổi bất kỳ cột nào thành Số. Nó sẽ không tạo một cột mới mà chỉ thay thế các giá trị bằng dữ liệu số.

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


0

Mã một dòng:

df[['cc']] = df[['cc']].apply(lambda col:pd.Categorical(col).codes)

Điều này cũng hoạt động nếu bạn có list_of_columns:

df[list_of_columns] = df[list_of_columns].apply(lambda col:pd.Categorical(col).codes)

Hơn nữa, nếu bạn muốn giữ các NaNgiá trị của mình, bạn có thể áp dụng thay thế:

df[['cc']] = df[['cc']].apply(lambda col:pd.Categorical(col).codes).replace(-1,np.nan)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.