函数应用
不管是为 pandas 对象应用自定义函数,还是应用其它第三方函数,都离不开以下三种方法。用哪种方法取决于操作的对象是
DataFrame
或
Series
,是行或列,还是元素。
- 表级函数应用:`pipe()`
- 行列级函数应用:
apply()
- 聚合 API:`agg()` 与 `transform()`
- 元素级函数应用:`applymap()`
表级函数应用
虽然可以把
DataFrame
与
Series
传递给函数。不过,通过链式调用函数时,最好使用
pipe()
方法。对比以下两种方式:
# f, g, and h are functions taking and returning ``DataFrames``
>>> f(g(h(df), arg1=1), arg2=2, arg3=3)
下列代码与上述代码等效
>>> (df.pipe(h)
... .pipe(g, arg1=1)
... .pipe(f, arg2=2, arg3=3))
pandas 鼓励使用第二种方式,即链式方法。在链式方法中调用自定义函数或第三方支持库函数时,用
pipe
更容易,与用 pandas 自身方法一样。上例中,
f
、
g
与
h
这几个函数都把
DataFrame
当作首位参数。要是想把数据作为第二个参数,该怎么办?本例中,
pipe
为元组 (
callable,data_keyword
)形式。
.pipe
把
DataFrame
作为元组里指定的参数。下例用 statsmodels 拟合回归。该 API 先接收一个公式,
DataFrame
是第二个参数,
data
。要传递函数,则要用
pipe
接收关键词对 (
sm.ols,'data'
)。
In [138]: import statsmodels.formula.api as sm
In [139]: bb = pd.read_csv('data/baseball.csv', index_col='id')
In [140]: (bb.query('h > 0')
.....: .assign(ln_h=lambda df: np.log(df.h))
.....: .pipe((sm.ols, 'data'), 'hr ~ ln_h + year + g + C(lg)')
.....: .fit()
.....: .summary()
.....: )
.....:
Out[140]:
<class 'statsmodels.iolib.summary.Summary'>
"""OLS Regression Results
==============================================================================Dep. Variable: hr R-squared: 0.685
Model: OLS Adj. R-squared: 0.665
Method: Least Squares F-statistic: 34.28
Date: Thu, 22 Aug 2019 Prob (F-statistic): 3.48e-15
Time: 15:48:59 Log-Likelihood: -205.92
No. Observations: 68 AIC: 421.8
Df Residuals: 63 BIC: 432.9
Df Model: 4
Covariance Type: nonrobust
===============================================================================
coef std err t P>|t| [0.025 0.975]
-------------------------------------------------------------------------------
Intercept -8484.7720 4664.146 -1.819 0.074 -1.78e+04 835.780
C(lg)[T.NL] -2.2736 1.325 -1.716 0.091 -4.922 0.375
ln_h -1.3542 0.875 -1.547 0.127 -3.103 0.395
year 4.2277 2.324 1.819 0.074 -0.417 8.872
g 0.1841 0.029 6.258 0.000 0.125 0.243
==============================================================================
Omnibus: 10.875 Durbin-Watson: 1.999
Prob(Omnibus): 0.004 Jarque-Bera (JB): 17.298
Sk