这是一个大熊猫的bug或功能吗?

时间:2014-11-22 18:32:45

标签: python pandas boolean

如果满足一些条件,我试图用常数填充一个熊猫系列。作为简化的测试用例,我将使用以下内容:

'-'*pd.Series([True]*5, dtype=bool)

这导致:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-89-0e3400ddc239> in <module>()
----> 1 '-'*pd.Series([True]*5, dtype=bool)

C:\Anaconda\lib\site-packages\pandas\core\ops.pyc in wrapper(left, right, name)
    529             if hasattr(lvalues, 'values'):
    530                 lvalues = lvalues.values
--> 531             return left._constructor(wrap_results(na_op(lvalues, rvalues)),
    532                                      index=left.index, name=left.name,
    533                                      dtype=dtype)

C:\Anaconda\lib\site-packages\pandas\core\ops.pyc in na_op(x, y)
    476                 result = np.empty(len(x), dtype=x.dtype)
    477                 mask = notnull(x)
--> 478                 result[mask] = op(x[mask], y)
    479             else:
    480                 raise TypeError("{typ} cannot perform the operation {op}".format(typ=type(x).__name__,op=str_rep))

TypeError: only integer arrays with one element can be converted to an index

但是,如果我这样做:

'-'*pd.Series([True]*5, dtype=bool).astype(object)

我得到了预期的结果:

0    -
1    -
2    -
3    -
4    -
dtype: object

有人可以向我解释发生了什么事吗?我可能选择了一种尴尬的做法吗?

1 个答案:

答案 0 :(得分:0)

我认为您使用*运算符选择了一种笨拙的方法。使用pandas.Series.map可能更容易吗?

例如。

pd.Series([True]*5,dtype=bool).map( lambda x : '-' if x else None )

如果你开始使用*运算符,我会注意到你可以在两个向量上使用它,而不是在标量+向量上使用它:

my_filter = pd.Series([True]*5,dtype=bool)
pd.Series('-',index=my_filter.index) * my_filter

或者(或多或少地确定)如果您在前面调整dtype,它会起作用:

'-' * pd.Series([True]*5,dtype=object)