我一直认为*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
吗?
答案 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
。