为什么不将工作替换为以元组为键的字典?

时间:2018-07-12 15:10:10

标签: python pandas dictionary series

我一直认为*client.name*,*numberofsites*,*numerberofdevices*(total, every site grouped together). SELECT sq.*, count(Devices.id) from ( SELECT Clients.id,Clients.name,Clients.notes,count (Sites.id),Sites.ids FROM Clients left join Sites on Clients.id=Sites.id Cliente group by Clients.id) as sq left join Devices on Devices.idSites=sq.Sites.id group by sq.Sites.id 本质上是相同的,除了当您要传递不在提供的字典中的键的值时,会使用.map。但是,我对为什么.replace在传递以元组为键的字典时抛出.replace却为什么.replace在同一个字典中能按预期工作的情况感到困惑。

例如:

TypeError
  

TypeError:无法比较类型'ndarray(dtype = object)'和'tuple'

对于以元组为键的字典,我不能使用.map吗?

1 个答案:

答案 0 :(得分:2)

不,这不起作用

首先熊猫从字典中获取键和值,然后使用这些可迭代项调用replace

keys, values = zip(*items)
to_replace, value = keys, values

return self.replace(to_replace, value, inplace=inplace,
                    limit=limit, regex=regex)

接下来,由于您现在拥有类似list_key的键和值,因此它将输入replace_list

elif is_list_like(to_replace):  # [NA, ''] -> [0, 'missing']
    if is_list_like(value):
        new_data = self._data.replace_list(src_list=to_replace, dest_list=value,
                                           inplace=inplace, regex=regex)

接下来,replace_list尝试在元组数组和值数组之间进行比较:

def comp(s):
    if isnull(s):
        return isnull(values)
    return _possibly_compare(values, getattr(s, 'asm8', s),
                             operator.eq)

masks = [comp(s) for i, s in enumerate(src_list)]

最后,_possibly_compare会在键像数组一样的情况下检查值是否由标量组成,从而导致错误:

if is_scalar(result) and (is_a_array or is_b_array):
    raise TypeError("Cannot compare types %r and %r" % tuple(type_names))

有些位,可能是重要的位,我在这里已排除在外。但是希望您能掌握要点。

结论

我认为pd.Series.replace存在严重问题。与大多数Pandas API不同,它在实现和性能方面通常都是不可预测的。显然,它的某些块是用纯Python编写的,表现不佳。

documentation很好地概括了歧义:

  

此方法有很多选择。鼓励您尝试并   尝试使用此方法以获得有关其工作原理的直觉。

pd.Series.map高效,并且不受replace中实现的纯Python逻辑的影响。

另请参见Replace values in a pandas series via dictionary efficiently

贴上map,不要回头看replace