将Pandas DataFrames合并到分类序列中

时间:2014-11-27 06:29:03

标签: python join pandas merge

我试图了解pandas是否支持在分类数据列上合并DataFrame(即dtype =" category")。

我的大部分数据都在R中工作,但我正在尝试在Python / pandas中做更多的工作。在R中,合并因子(类似于分类dtype)诱导类型强制,通常是字符。这允许一个数据帧具有指定为因子(分类)的副变量(连接列),而另一个数据帧具有作为字符串的副变量。在合并/加入之前,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

1 个答案:

答案 0 :(得分:3)

简而言之,在0.15.1中,合并行为已经改变(实际上是固定的),以允许合并具有完全相同类别的分类。此外,如果允许合并对象数组,则返回的合并的结果字符现在将是对象(IIRC)。我不记得我们是否试图将其推断回分类。

我创建了一个问题here,供讨论。

上面显示的相等,例如不允许比较分类与对象dtypes,而最近扩展了合并行为以允许合并类似分类和对象dtypes(假设所有合并的分类共享相同的类别)。

所以我认为允许平等工作只是API无法追赶。我们将在0.16.0中解决这个问题,但请提供有关该问题的评论。

PR为here

这将是即将发布的0.15.2版本(定于2014年12月7日这一周)