type(np.clip(pd.Series(range(10)), 2, 3))
是pd.Series
。
type(np.clip(range(10), 2, 3))
是np.array
为什么pd.Series
可以在应用numpy
函数后保持其类型?
答案 0 :(得分:6)
pd.Series
有一个剪辑方法(defined in pandas/core/generic.py)。
def clip(self, lower=None, upper=None, out=None, axis=None):
...
result = self
if lower is not None:
result = result.clip_lower(lower, axis)
if upper is not None:
result = result.clip_upper(upper, axis)
return result
np.clip
(defined in numpy/core/fromnumeric.py)按照第一个参数clip
方法,如果它有一个:
def clip(a, a_min, a_max, out=None):
try:
clip = a.clip
except AttributeError:
return _wrapit(a, 'clip', a_min, a_max, out)
return clip(a_min, a_max, out)
Series.clip
方法返回pd.Series
,因此np.clip
会返回pd.Series
。
当然,这也表明你可以使用
pd.Series(range(10)).clip(2, 3)
而不是
np.clip(pd.Series(range(10)), 2, 3)
这是" duck-typing" (如果它像鸭子一样嘎嘎叫,就像鸭子一样......它是一只鸭子!)。如果具有相同接口的对象(例如,相同的方法名称)可以以相同的方式处理,我们可以从代码中获得更多的里程数。