【问题标题】:Merging Pandas DataFrames on categorical series在分类系列上合并 Pandas DataFrames
【发布时间】:2014-11-27 06:29:03
【问题描述】:

我试图了解 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

【问题讨论】:

    标签: python join pandas merge


    【解决方案1】:

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

    我创建了一个问题here 来讨论这个问题。

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

    所以我认为允许平等工作只是 API 没有赶上。我们将在 0.16.0 中解决此问题,但请提供有关此问题的 cmets。

    对此的公关是here

    这将在即将发布的 0.15.2 版本中(计划于 2014 年 12 月 7 日当周发布)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-25
      • 2019-08-27
      • 2018-05-16
      • 2019-08-06
      • 2018-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多