给大家分享了pandas的apply函数拆分文本中pd.Series函数的使用方法。所有人都得挂了!数据来自akshare。由于akshare版本的更新,部分接口发生了变化,导致上述文章中的代码无法正常运行。因此,今天将更新代码。另外,在上面的文章中,apply使用了使用自定义函数的功能。在上一篇文章中,自定义函数只有一个参数。有同学问了一个问题,自定义函数有两个参数怎么办?嗯嗯,这是个好问题!今天柠檬也来分享下自定义函数有两个参数的情况下如何解决。接下来先更新上一篇文章的代码。01使用apply分割文本Pandas中的apply函数被广泛使用。今天给大家分享一个技巧,使用apply将dataframe中内容为list的列拆分为多列。拆分前的数据情况如下图红色部分所示:拆分后如下图所示:本例中Lemon使用的数据来自akshare。开始前先介绍一下相关包:#-*-coding:utf-8-*-"""@Author:Lemon@Production:TheWayofPythonData@Homepage:liyangbit.com"""importnumpyasnpimportpandasaspdimportakshareasak几个Python的版本信息Lemon使用的库如下:print('numpyversion:{}'.format(np.__version__))print('pandasversion:{}'.format(pd.__version__))print('akshareversion:{}'.format(ak.__version__))#numpyversion:1.18.1#pandasversion:1.0.3#akshareversion:0.7.53如果代码运行有问题,请检查这些Python库的版本是否正确与上述一致。首先从akshare获取需要的数据,分为两步。第一步获取基金代码列表,如下:df=ak.fund_em_fund_name().head(20).tail(5)dfdf=df[['基金代码','基金简称']]print(df)第二步获取基金净值数据,净值日期是通过自定义函数获取的。自定义函数如下:#自定义函数只有一个参数的情况#获取基金单位净值和净值日期defget_mutual_fund(code):df=ak.fund_em_open_fund_info(fund=code,indicator="unitnetworthtrend")dfdf=df[['净值日期','单位净值','日增长率']]#df.columns=['净值日期','单位净值','equityReturn','unitMoney']df['权益日']=pd.to_datetime(df['权益日'])dfdf=df.sort_values('权益日',ascending=False)unit_equity=df.head(1)['单位净值值'].values[0]date_latest=df.head(1)['netvaluedate'].values[0]return[unit_equity,date_latest]这个自定义函数,在pandas中使用apply来套用自定义函数,这是一种常用的apply方式方法如下:#获取基金最新单位净值及净值日期df['tmp']=df['fundcode'].apply(get_mutual_fund)print(df)获取的截图数据如下:上图中的textsplittmp列就是我们这次需要处理的对象。有很多方法可以处理它。在这里,Lemon使用pandas中的apply来处理它。相对来说,也是一种比较方便的方式。在apply函数中,使用pd.Series就可以达到我们的目的。#将单位净值和净值日期分开列df[['最新单位净值','净值日期']]=df['tmp'].apply(pd.Series)dfdf=df.drop('tmp',axis=1)print(df)的结果如下:02有两个参数的函数。pandas中的apply函数在应用自定义函数时,通常没有参数或者只有一个参数。如果有两个参数,可以吗?使用apply函数怎么样?答案是肯定的。这里我们也讨论一下。仍然以上述案例为原型,同样,先从aksharedf1=ak.fund_em_fund_name().head(20).tail(5)df1df1=df1[['基金代码','基金简称']]获取数据接下来自定义一个有两个参数的函数,如下:#自定义函数有两个参数的情况#获取年末的基金净值数据defget_mutual_fund_year(code,year):year=str(year)df=ak。fund_em_open_fund_info(fund=code,indicator="单位净值趋势")dfdf=df[['净值日','单位净值','日增长率']]#df.columns=['净值日','单位净值','equityReturn','unitMoney']df['权益日']=pd.to_datetime(df['权益日'])dfdf=df.sort_values('权益日',ascending=False)dfdf=df.set_index('股权日期')[年]dfdf=df.reset_index()unit_equity=df.head(1)['单位股权'].values[0]date=df.head(1)['股权日期']。values[0]return[unit_equity,date]Acustomfunctionwithtwoparameters然后,使用apply应用上述带有两个参数的自定义函数。核心点是嵌套lambda函数,固定其中一个参数。具体如下:df1['tmp']=df1['fundcode'].apply(lambdacode:get_mutual_fund_year(code,2019))后面还是文本拆分,实现代码如下:#把单位净值和净值日期单独列df1[['最新单位净值','净值日期']]=df1['tmp'].apply(pd.Series)df1df1=df1.drop('tmp',axis=1)print(df1)有应用场景同学们可能会问,用两个参数的自定义函数有什么用?这里柠檬也分享一个应用场景:根据上面的基础原型数据,创建一个特定年份的下拉列表,选择不同年份时,返回不同年份的结果,包括文本数据,表格网格数据和图表如下:涉及到一些个人数据,所以没有完整展示~~其他应用场景欢迎分享!
