网站付费怎么做,龙岩网页制作公司,网站开发人员考核,江西省建设局网站文章目录 12.3 Techniques for Method Chaining#xff08;方法链接的技巧#xff09;1 The pipe Method#xff08;pipe方法#xff09; 12.3 Techniques for Method Chaining#xff08;方法链接的技巧#xff09;
对序列进行转换的时候#xff0c;我们会发现会创建很… 文章目录 12.3 Techniques for Method Chaining方法链接的技巧1 The pipe Methodpipe方法 12.3 Techniques for Method Chaining方法链接的技巧
对序列进行转换的时候我们会发现会创建很多再也不会用到的临时变量temporary variable。比如下面的例子
df load_data()
df2 df[df[col2] 0]
df2[col1_demeaned] df2[col1] - df2[col1].mean()
result df2.groupby(key).col1_demeaned.std()这里我们不使用任何真实数据这个例子说明了一些新方法。首先DataFrame.assign方法是一个函数它可以作为列赋值方法df[k] v的替代品。它不会修改原有的对象而是会返回一个带有修改标识的新DataFrame对象。所以下面两个方法是相等的
# Usual non-functional way
df2 df.copy()
df2[k] v# Functional assign way
df2 df.assign(kv)
在原始对象上直接进行赋值比用assign会更快一些但是assign可以使用更方便的方法链接method chaining:
result (df2.assign(col1_demeaneddf2.col1 - df2.col2.mean()).groupby(key).col1_demeaned.std())需要记住的是当使用方法链接的时候你可能会需要引用临时对象。在之后的例子我们不能引用load_data的结果除非它被赋值给临时变量df. 。为了做到这一点assign和其他一些pandas函数接受像函数一样函数参数function-like arguments也被称作为可调用callables。
为了演示callables考虑上面例子里的一个片段
df load_data()
df2 df[df[col2] 0]这句可以被写为
df (load_data()[lambda x: x[col2] 0])在这里load_data的结果没有赋值给参数所以传入[]中的函数被绑定到了绑定到了在某个链接状态下的对象上so the function passed into [] is then bound to the object at that stage of the method chain。
我们可以把整个序列携程一行链接表达式
result (load_data()[lambda x: x.col2 0].assign(col1_demeanedlambda x: x.col1 - x.col1.mean()).groupby(key).col1_demeaned.std())我们可以把代码写成这种风格但也可以分解成为步来写这样可读性会更高。
1 The pipe Methodpipe方法
我们可以利用pandas内建的函数和一些用callables实现的方法链接做很多事情。不过有时候我们想要用自己的函数或一些第三方库里的函数。这就是pipe方法出现的原因。
假设有一系列函数调用
a f(df, arg1v1)
b g(a, v2, arg3v3)
c h(b, arg4v4)当使用函数来接受或返回Series或DataFrame对象的时候我们可以把上面的利用pipe重写为
result (df.pipe(f, arg1v1).pipe(g, v2, arg3v3) .pipe(h, arg4v4))f(df)和df.pipe(f)是一样的但是pipe能让链接调用更简单。
pipe一个有用的模式是生成一系列可重复的函数操作。例如考虑计算两个组的平均值的差
g df.groupby([key1, key2])
df[col1] df[col1] - g.transform(mean)假设我们想要能对不止一个组进行减值只要改变分组键group key即可。除此之外我们可能想要把这种转换用方法链接的形式实现。这里有一个例子
def group_demean(df, by, cols):result df.copy() g df.groupby(by) for c in cols:result[c] df[c] - g[c].transform(mean) return result上面的也可以写为
result (df[df.col1 0] .pipe(group_demean, [key1, key2], [col1]))