2014-11-27 3 views
1

pandas가 범주형 데이터 열 (즉 dtype = "category")에서 DataFrames를 병합 할 수 있는지 이해하려고합니다.범주 형 시리즈의 팬더 데이터 프레임 병합

대부분의 데이터는 R에서 작동하지만 파이썬/팬더에서 더 많은 작업을 수행하려고합니다. R에서 요소 (범주 형 dtype과 유사)를 병합하면 형식 강제 변환이 일반적으로 문자에 적용됩니다. 이렇게하면 하나의 데이터 프레임이 요인 (범주 형)으로 지정된 by-variable (조인 열)을 가지며 by-variable을 문자열로 가질 수 있습니다. pandas는 병합/결합 이전에 범주 형 데이터를 문자열과 비슷한 방식으로 수행합니까? 카테고리 분류 병합이 강력 할 것으로 기대합니까? 팬더에서 (자동) 유형 강요에 관한 문서는 어디에서 찾을 수 있습니까?

간단한 예 :

In [52]: 
import pandas as pd 

a = pd.Series(['a','b','c'],dtype="category") 
b = pd.Series(['a','b','c'],dtype="object") 
c = pd.Series(['a','b','cc'],dtype="object") 

In [54]: 

a==b 

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
... 
TypeError: Cannot compare a Categorical for op <built-in function eq> with type <class   'numpy.ndarray'>. If you want to compare values, use 'series <op> np.asarray(cat)'. 

+++ 그러나 DataFrame 병합 :

는 +++이 아닌 범주/비 스칼라 벡터에 대한 평등에 대한 범주 벡터를 테스트하는 오류입니다 다른 유형의 열 (하나의 범주 형, 하나의 문자열)에 오류가 발생하지 않습니다 (최소한이 간단한 경우). 강제의 일부 유형은 발생해야합니다

In [59]: 
A = pd.DataFrame({'A':a,'B':[1,2,3]}) 
B = pd.DataFrame({'A':b,'C':[4,5,6]}) 
print(A.merge(B,on='A')) 
    A B C 
0 a 1 4 
1 b 2 5 
2 c 3 6 

답변

3

그래서 짧은에, 병합 동작이 변경되었습니다 0.15.1에 (정말 고정)은 정확히 같은 범주를했다 Categoricals의 병합을 허용 할 수 있습니다. 또한 객체 배열이 병합 된 경우 허용되지만 반환 된 병합의 결과 문자는 이제 객체 (IIRC)가됩니다. 우리가 범주 형으로 추론하려고 시도했는지 기억하지 못합니다.

이에 대한 토론을 위해 here 호를 작성했습니다. 상기 한 등가가 동일하다. Categoricals와 Object dtypes의 비교를 허용하지 않는 것이 먼저 수행되었으며, 병합 동작은 최근에 같은 Categoricals 및 Object dtypes의 병합을 허용하도록 확장되었습니다 (모든 병합 된 Categorical이 동일한 범주를 공유한다고 가정).

그래서 평등을 허용하는 것이 API가 따라 잡을 수 없다고 생각합니다. 우리는 이것을 0.16.0에서 다루 겠지만, pls는이 문제에 대해 의견을 제시합니다. 이것에 대한

PR은 here

이것은 (12 월 (7) 주 예정, 2014) 곧 0.15.2 버전에있을 것입니다