2013-03-12 30 views
7

tôi có thể chuyển đổi một cột chuỗi gấu trúc để Categorical, nhưng khi tôi cố gắng để chèn nó như là một cột DataFrame mới có vẻ như để có được chuyển đổi trở lại quyền loạt các str:Làm thế nào để tạo các cột DataFrame của Categorical từ cột chuỗi?

train['LocationNFactor'] = pd.Categorical.from_array(train['LocationNormalized']) 

>>> type(pd.Categorical.from_array(train['LocationNormalized'])) 
<class 'pandas.core.categorical.Categorical'> 
# however it got converted back to... 
>>> type(train['LocationNFactor'][2]) 
<type 'str'> 
>>> train['LocationNFactor'][2] 
'Hampshire' 

đoán này là bởi vì Categorical doesn' t bản đồ cho bất kỳ loại numpy dtype; vì vậy tôi phải chuyển đổi nó thành một số loại int, và do đó mất các yếu tố nhãn < -> mức độ hiệp hội? Cách giải quyết thanh lịch nhất để lưu trữ cấp độ < -> liên kết nhãn và giữ lại khả năng chuyển đổi trở lại là gì? (Chỉ cần lưu trữ như một dict như here, và tự chuyển đổi khi cần thiết?) Tôi nghĩ Categorical is still not a first-class datatype for DataFrame, không giống như R.

(Sử dụng gấu trúc 0.10.1, numpy 1.6.2, python 2.7.3 - các macports phiên bản mới nhất của mọi điều).

Trả lời

6

Các chỉ workaround cho gấu trúc trước 0,15 tôi thấy như sau:

  • cột phải được chuyển đổi sang một phạm trù cho phân loại, nhưng NumPy sẽ ngay lập tức ép buộc các cấp trở lại int, mất thông tin yếu tố
  • để lưu trữ các yếu tố trong một biến toàn cục bên ngoài dataframe

.

train_LocationNFactor = pd.Categorical.from_array(train['LocationNormalized']) # default order: alphabetical 

train['LocationNFactor'] = train_LocationNFactor.labels # insert in dataframe 

[UPDATE: gấu trúc 0.15+ added decent support for Categorical]

0

Nhãn < -> các cấp được lưu trữ trong đối tượng chỉ mục.

  • Để chuyển đổi một mảng số nguyên vào mảng chuỗi: chỉ số [integer_array]
  • Để chuyển đổi một mảng chuỗi để nguyên mảng: index.get_indexer (string_array)

Dưới đây là một số exampe:

In [56]: 

c = pd.Categorical.from_array(['a', 'b', 'c', 'd', 'e']) 

idx = c.levels 

In [57]: 

idx[[1,2,1,2,3]] 

Out[57]: 

Index([b, c, b, c, d], dtype=object) 

In [58]: 

idx.get_indexer(["a","c","d","e","a"]) 

Out[58]: 

array([0, 2, 3, 4, 0]) 
+2

Tôi biết rằng, nhưng vấn đề ở đây là tất cả được thổi trở lại str khi chúng ta gán cho một cột DataFrame, giống như tôi đã giới thiệu: 'tàu [ 'LocationNFactor' ] = pd.Categorical ... ' – smci

Các vấn đề liên quan