1、Pandas中文官方文档之基础用法3函数应用不管是为 pandas 对象应用自定义函数,还是应用其它第三方函数,都离不开以下三种方法。用哪种方法取决于操作的对象是DataFrame或Series,是行或列,还是元素。1. 表级函数应用:pipe()2. 行列级函数应用:apply()3. 聚合 API:agg() 与 transform()4. 元素级函数应用:applymap()表级函数应用虽然可以把 DataFrame与Series传递给函数。不过,通过链式调用函数时,最好使用pipe()方法。对比以下两种方式:#f,g,andharefunctionstakingandreturning
2、DataFramesf(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作为元组里指定的参数。下例用 statsm
3、odels 拟合回归。该 API 先接收一个公式,DataFrame是第二个参数,data。要传递函数,则要用pipe接收关键词对 (sm.ols,data)。In138:importstatsmodels.formula.apiassmIn139:bb=pd.read_csv(data/baseball.csv,index_col=id)In140:(bb.query(h0).:.assign(ln_h=lambdadf:np.log(df.h).:.pipe(sm.ols,data),hrln_h+year+g+C(lg).:.fit().:.summary().:).:Out140:OL
4、SRegressionResults=Dep.Variable:hrR-squared:0.685Model:OLSAdj.R-squared:0.665Method:LeastSquaresF-statistic:34.28Date:Thu,22Aug2019Prob(F-statistic):3.48e-15Time:15:48:59Log-Likelihood:-205.92No.Observations:68AIC:421.8DfResiduals:63BIC:432.9DfModel:4CovarianceType:nonrobust=coefstderrtP|t|0.0250.97
5、5-Intercept-8484.77204664.146-1.8190.074-1.78e+04835.780C(lg)T.NL-2.27361.325-1.7160.091-4.9220.375ln_h-1.35420.875-1.5470.127-3.1030.395year4.22772.3241.8190.074-0.4178.872g0.18410.0296.2580.0000.1250.243=Omnibus:10.875Durbin-Watson:1.999Prob(Omnibus):0.004Jarque-Bera(JB):17.298Skew:0.537Prob(JB):0
6、.000175Kurtosis:5.225Cond.No.1.49e+07=Warnings:1StandardErrorsassumethatthecovariancematrixoftheerrorsiscorrectlyspecified.2Theconditionnumberislarge,1.49e+07.Thismightindicatethattherearestrongmulticollinearityorothernumericalproblems.unix 的pipe与后来出现的 dplyr 及 magrittr 启发了pipe方法,在此,引入了 R 语言里用于读取 pip
7、e 的操作符 (%)。pipe的实现思路非常清晰,仿佛 Python 源生的一样。强烈建议大家阅读 pipe()的源代码。行列级函数应用apply()方法可以沿着 DataFrame 的轴应用任何函数,比如,描述性统计方法,该方法支持 axis参数。In141:df.apply(np.mean)Out141:one0.811094two1.360588three0.187958dtype:float64In142:df.apply(np.mean,axis=1)Out142:a1.583749b0.734929c1.133683d-0.166914dtype:float64In143:df.a
8、pply(lambdax:x.max()-x.min()Out143:one1.051928two1.632779three1.840607dtype:float64In144:df.apply(np.cumsum)Out144:onetwothreea1.3949811.772517NaNb1.7380353.684640-0.050390c2.4332815.1630081.177045dNaN5.4423530.563873In145:df.apply(np.exp)Out145:onetwothreea4.0348995.885648NaNb1.4092446.7674400.9508
9、58c2.0042014.3857853.412466dNaN1.3222620.541630apply()方法还支持通过函数名字符串调用函数。In146:df.apply(mean)Out146:one0.811094two1.360588three0.187958dtype:float64In147:df.apply(mean,axis=1)Out147:a1.583749b0.734929c1.133683d-0.166914dtype:float64默认情况下,apply()调用的函数返回的类型会影响DataFrame.apply输出结果的类型。 函数返回的是Series时,最终输出的
10、结果是DataFrame。输出的列与函数返回的Series索引相匹配。 函数返回其它任意类型时,输出结果是Series。result_type会覆盖默认行为,该参数有三个选项:reduce、broadcast、expand。这些选项决定了列表型返回值是否扩展为DataFrame。用好apply()可以了解数据集的很多信息。比如可以提取每列的最大值对应的日期:In148:tsdf=pd.DataFrame(np.random.randn(1000,3),columns=A,B,C,.:index=pd.date_range(1/1/2000,periods=1000).:In149:tsdf.a
11、pply(lambdax:x.idxmax()Out149:A2000-08-06B2001-01-18C2001-07-18dtype:datetime64ns还可以向apply()方法传递额外的参数与关键字参数。比如下例中要应用的这个函数:defsubtract_and_divide(x,sub,divide=1):return(x-sub)/divide可以用下列方式应用该函数:df.apply(subtract_and_divide,args=(5,),divide=3)为每行或每列执行Series方法的功能也很实用:In150:tsdfOut150:ABC2000-01-01-0.1
12、58131-0.2324660.3216042000-01-02-1.810340-3.1057580.4338342000-01-03-1.209847-1.156793-0.1367942000-01-04NaNNaNNaN2000-01-05NaNNaNNaN2000-01-06NaNNaNNaN2000-01-07NaNNaNNaN2000-01-08-0.6536020.1788751.0082982000-01-091.0079960.4628240.2544722000-01-100.3074730.6003371.643950In151:tsdf.apply(pd.Series
13、.interpolate)Out151:ABC2000-01-01-0.158131-0.2324660.3216042000-01-02-1.810340-3.1057580.4338342000-01-03-1.209847-1.156793-0.1367942000-01-04-1.098598-0.8896590.0922252000-01-05-0.987349-0.6225260.3212432000-01-06-0.876100-0.3553920.5502622000-01-07-0.764851-0.0882590.7792802000-01-08-0.6536020.178
14、8751.0082982000-01-091.0079960.4628240.2544722000-01-100.3074730.6003371.643950apply()有一个参数raw,默认值为False,在应用函数前,使用该参数可以将每行或列转换为Series。该参数为True时,传递的函数接收 ndarray 对象,若不需要索引功能,这种操作能显著提高性能。聚合 API0.20.0 版新增。聚合 API 可以快速、简洁地执行多个聚合操作。Pandas 对象支持多个类似的 API,如 groupby API、window functions API、resample API。聚合函数为D
15、ataFrame.aggregate(),它的别名是DataFrame.agg()。这里使用与前例类似的DataFrame:In152:tsdf=pd.DataFrame(np.random.randn(10,3),columns=A,B,C,.:index=pd.date_range(1/1/2000,periods=10).:In153:tsdf.iloc3:7=np.nanIn154:tsdfOut154:ABC2000-01-011.2576061.0041940.1675742000-01-02-0.7498920.288112-0.7573042000-01-03-0.207550
16、-0.2985990.1160182000-01-04NaNNaNNaN2000-01-05NaNNaNNaN2000-01-06NaNNaNNaN2000-01-07NaNNaNNaN2000-01-080.814347-0.2576230.8692262000-01-09-0.250663-1.2066010.8968392000-01-102.169758-1.3333630.283157应用单个函数时,该操作与apply()等效,这里也可以用字符串表示聚合函数名。下面的聚合函数输出的结果为Series:In155:tsdf.agg(np.sum)Out155:A3.033606B-1.
17、803879C1.575510dtype:float64In156:tsdf.agg(sum)Out156:A3.033606B-1.803879C1.575510dtype:float64#因为应用的是单个函数,该操作与.sum()是等效的In157:tsdf.sum()Out157:A3.033606B-1.803879C1.575510dtype:float64对Series进行单个聚合操作,返回的是标量值:In158:tsdf.A.agg(sum)Out158:3.033606102414146多函数聚合还可以用列表形式传递多个聚合函数。每个函数在输出结果DataFrame里以行的形式
18、显示,行名是每个聚合函数的函数名。In159:tsdf.agg(sum)Out159:ABCsum3.033606-1.8038791.57551多个函数输出多行:In160:tsdf.agg(sum,mean)Out160:ABCsum3.033606-1.8038791.575510mean0.505601-0.3006470.262585对于Series,多个函数返回的结果也是Series,其索引为函数名:In161:tsdf.A.agg(sum,mean)Out161:sum3.033606mean0.505601Name:A,dtype:float64传递lambda函数时,输出名为
19、的行:In162:tsdf.A.agg(sum,lambdax:x.mean()Out162:sum3.0336060.505601Name:A,dtype:float64应用自定义函数时,则该函数名为输出结果的行名:In163:defmymean(x):.:returnx.mean().:In164:tsdf.A.agg(sum,mymean)Out164:sum3.033606mymean0.505601Name:A,dtype:float64用字典实现聚合指定为哪些列应用哪些聚合函数时,需要把包含列名与标量(或标量列表)的字典传递给DataFrame.agg。注意:这里输出结果的顺序不是
20、固定的,要想让输出顺序与输入顺序一致,请使用OrderedDict。In165:tsdf.agg(A:mean,B:sum)Out165:A0.505601B-1.803879dtype:float64输入的参数是列表时,输出结果为 DataFrame,并以矩阵形式显示所有聚合函数的计算结果,且输出结果由所有唯一函数组成。未执行聚合操作的列输出结果为NaN值:In166:tsdf.agg(A:mean,min,B:sum)Out166:ABmean0.505601NaNmin-0.749892NaNsumNaN-1.803879多种 DtypeDataFrame里包含不能执行聚合操作的多种 Dtype 时,.agg只计算可以执行聚合的列。这与groupby的.agg操作类似:In167:mdf=pd.DataFrame(A:1,2,3,.:B:1.,2.,3.,.:C:foo,bar,baz,.:D:pd.date_range(20130101,periods=3).:In168:mdf.dtypesOut168:Aint64Bfloat64CobjectDdatetime64nsdtype:objectIn169:mdf.agg(min,sum)Out169:ABCDmin11.0bar2013-01-01sum66.0foobarbazNaT自定义 Desc
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1