作者 |阳哥 Pandas 可以说是 在Python数据科学领域应用最为广泛的工具之一。 Pandas是一种高效的数据处理库,它以 dataframe 和 series 为基本数据类型,呈现出类似excel的二维数据。 在数据处理过程中,咱们经常需要将列按照一定的要求进行排序,以方便展示。 这里,给大家分享下 在 Pandas 中将列排序的几种常用方法。 数据准备 文中主要使用了 pandas 和 akshare ,首先导入 Python 库,如下: importpandasaspdimportakshareasakprint(f'pandasversion:{pd.__version__}') 本次使用的数据如下: data={'brand':['Python数据之道','价值前瞻','菜鸟数据之道','Python','Java'],'B':[4,6,8,12,10],'A':[10,2,5,20,16],'D':[6,18,14,6,12],'years':[4,1,1,30,30],'C':[8,12,18,8,2], } df=pd.DataFrame(data=data) df 现将现有的 columns 输出,方便后面 copy 使用。 df.columns #Index(['brand','B','A','D','years','C'],dtype='object') Method 1 第一种方法,也是我自己常用的方法,就是自己将列的名称按需要进行手动排序,然后运行代码如下: Method 2 第二种方法,是使用 .iloc 方法,通过列的位置来进行排序,如下: Method 3 第三种方法,是使用 .loc 方法,通过列的名称来进行排序,如下: 这种方法跟第一种方法类似,个人觉得第一种方法更简洁些。 Method 4 第四种是 逆序 排序,算是排序中一种特定的排序方式。 #Method4,逆序 cols=list(df.columns) cols.reverse() df[cols] 上述代码中,cols.reverse() 是将列表(list)进行逆序排序。 此外,列表(list)的逆序排序,还可以用 cols[::-1] 来实现。因此,下面的方法也可以实现逆序排序。 #Method4,逆序 cols=list(df.columns) df[cols[::-1]] 实战案例:自由排序 有时候,当存在变量、列的数量较多,或者不同的dataframe中列的名称不完全一致等情况出现时,咱们不一定会通过列名称来实现排序。 这里分享一个实战案例,是关于制作基金的十大持仓数据表的,具体过程我就不在这里描述了,下面给出实现的函数,有兴趣的同学可以研究下。 自定义函数如下: #需要安装akshare #pipinstallakshare years=['2019','2020','2021'] deffund_stock_holding(years,code): data=pd.DataFrame() foryrinyears: df_tmp=ak.fund_em_portfolio_hold(code=code,year=yr) data=data.append(df_tmp) data['季度']=data['季度'].apply(lambdax:x[:8])data['占净值比例']=pd.to_numeric(data['占净值比例'])data=data.sort_values(['季度','持仓市值'],ascending=[True,False])df=data.set_index(['序号','季度']).stack().unstack([1,2]).head(10)df=df.loc[:,(slice(None),'股票名称')]df=df.droplevel(None,axis=1)df.columns.name=None df=df.reset_index() #df.index.name=None df['基金代码']=codereturndfdf=fund_stock_holding(years,'005669') df 得到的数据表格如下: 上面的表格中,我需要将 基金代码 这一列移动到 序号 这列的后面,由于 years = ['2019','2020','2021'] 这是一个变量,当具体的值不同时,会导致列名称不一样,因此,在这种情况下我们不能直接使用列的具体名称,但咱们可以通过 列的位置组合来实现,列的调整具体如下: cols=df.columns.tolist()cols=cols[:1]+cols[-1:]+cols[1:-1]#将基金代码列名放前面 df=df[cols] 将上面的调整过程整合到自定义函数中,完整的代码如下: #需要安装akshare #pipinstallakshare years=['2019','2020','2021'] deffund_stock_holding_update(years,code): data=pd.DataFrame() foryrinyears: df_tmp=ak.fund_em_portfolio_hold(code=code,year=yr) data=data.append(df_tmp) data['季度']=data['季度'].apply(lambdax:x[:8])data['占净值比例']=pd.to_numeric(data['占净值比例'])data=data.sort_values(['季度','持仓市值'],ascending=[True,False])df=data.set_index(['序号','季度']).stack().unstack([1,2]).head(10)df=df.loc[:,(slice(None),'股票名称')]df=df.droplevel(None,axis=1)df.columns.name=None df=df.reset_index() #df.index.name=None df['基金代码']=code cols=df.columns.tolist() cols=cols[:1]+cols[-1:]+cols[1:-1]#将基金代码列名放前面 df=df[cols] returndfdf=fund_stock_holding_update(years,'005669') df 效果如下: 当然,我最后实现的效果是将基金代码换成基金名称,这个可以想办法实现,效果如下: 小结 以上就是关于 Pandas 中 列名称排序的介绍,看似很简单的内容,在最后的实践中,也还是有些小技巧的。 欢迎大家来畅聊,Pandas 中有哪些实用的小技巧~~ 媒体来源:AI科技大本营 |
|