为什么np.clip(pd.Series(range(10)),2,3)会返回一个系列?

col*_*ang 2 python numpy pandas

type(np.clip(pd.Series(range(10)), 2, 3))是一个pd.Series.

type(np.clip(range(10), 2, 3)) 是一个 np.array

为什么pd.Seriesnumpy应用函数后可以保留其类型?

unu*_*tbu 6

pd.Series有一个剪辑方法(在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
Run Code Online (Sandbox Code Playgroud)

np.clip(在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)
Run Code Online (Sandbox Code Playgroud)

Series.clip方法返回一个pd.Series,所以np.clip返回一个pd.Series.当然,这也表明你可以使用

pd.Series(range(10)).clip(2, 3)
Run Code Online (Sandbox Code Playgroud)

代替

np.clip(pd.Series(range(10)), 2, 3)
Run Code Online (Sandbox Code Playgroud)

这是一个"鸭子打字"的例子(如果它像鸭子一样,像鸭子一样嘎嘎叫......它是一只鸭子!).如果具有相同接口的对象(例如,相同的方法名称)可以以相同的方式处理,我们可以从代码中获得更多的里程数.