2014-11-27 3 views
1

Я пытаюсь понять, поддерживает ли pandas объединение DataFrames на столбцах категориальных данных (т. Е. Dtype = "category").Объединение Pandas DataFrames в категориальных сериях

Я использую большинство своих данных в R, но пытаюсь сделать больше работы в Python/pandas. В R слияние по факторам (аналогично категориальному dtype) индуцирует принуждение типа, как правило, к характеру. Это позволяет одному кадру данных иметь переменную (столбец объединения), указанную как фактор (категориальный), а другой - свою переменную-строку. Помогают ли панды аналогичное принуждение категориальных данных к строке до слияния/присоединения? Должен ли я рассчитывать на то, что слияние с категориальными? Где я могу найти документацию о (автоматическом) типе принуждения в пандах?

Простой пример:

+++ Это ошибка, чтобы проверить категорический вектор для равенства в отношении не-категорического/нескалярного вектора:

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 для обсуждения этого вопроса.

Равновесие, показанное выше, например. не позволяя сначала сравнивать типы категориальных объектов с объектами dtypes, в то время как поведение слияния было недавно расширено, чтобы позволить слияние типа-категориальных объектов и объектов dtypes (при условии, что все объединенные категории имеют одинаковые категории).

Таким образом, я думаю, что разрешение равенства работать - это просто API, который не догоняет. Мы рассмотрим это в 0.16.0, но PLS предоставит комментарии по этой проблеме.

PR для этого here

Это будет в предстоящем 0.15.2 выпуска (намечен на неделю от 7 декабря 2014 года)

Смежные вопросы