Pandas實現(xiàn)列(column)排序的幾種方法
Pandas 可以說是 在Python數(shù)據(jù)科學領(lǐng)域應用最為廣泛的工具之一。
Pandas是一種高效的數(shù)據(jù)處理庫,它以 dataframe
和 series
為基本數(shù)據(jù)類型,呈現(xiàn)出類似excel的二維數(shù)據(jù)。
在數(shù)據(jù)處理過程中,咱們經(jīng)常需要將列按照一定的要求進行排序,以方便展示。
這里,給大家分享下 在 Pandas 中將列排序的幾種常用方法。
數(shù)據(jù)準備
文中主要使用了 pandas
和 akshare
,首先導入 Python 庫,如下:
import pandas as pd import akshare as ak print(f'pandas version: {pd.__version__}')
本次使用的數(shù)據(jù)如下:
data = { 'brand':['Python數(shù)據(jù)之道','價值前瞻','菜鳥數(shù)據(jù)之道','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
現(xiàn)將現(xiàn)有的 columns
輸出,方便后面 copy 使用。
df.columns # Index(['brand', 'B', 'A', 'D', 'years', 'C'], dtype='object')
Method 1
第一種方法,也是我自己常用的方法,就是自己將列的名稱按需要進行手動排序,然后運行代碼如下:
Method 2
第二種方法,是使用 .iloc
方法,通過列的位置來進行排序,如下:
Method 3
第三種方法,是使用 .loc
方法,通過列的名稱來進行排序,如下:
這種方法跟第一種方法類似,個人覺得第一種方法更簡潔些。
Method 4
第四種是 逆序 排序,算是排序中一種特定的排序方式。
# Method 4 ,逆序 cols = list(df.columns) cols.reverse() df[cols]
上述代碼中,cols.reverse()
是將列表(list)進行逆序排序。
此外,列表(list)的逆序排序,還可以用 cols[::-1]
來實現(xiàn)。因此,下面的方法也可以實現(xiàn)逆序排序。
# Method 4 ,逆序 cols = list(df.columns) df[cols[::-1]]
實戰(zhàn)案例:自由排序
有時候,當存在變量、列的數(shù)量較多,或者不同的dataframe中列的名稱不完全一致等情況出現(xiàn)時,咱們不一定會通過列名稱來實現(xiàn)排序。
這里分享一個實戰(zhàn)案例,是關(guān)于制作基金的十大持倉數(shù)據(jù)表的,具體過程我就不在這里描述了,下面給出實現(xiàn)的函數(shù),有興趣的同學可以研究下。
自定義函數(shù)如下:
# 需要安裝 akshare # pip install akshare years = ['2019','2020','2021'] def fund_stock_holding(years,code): data = pd.DataFrame() for yr in years: df_tmp = ak.fund_em_portfolio_hold(code=code,year=yr) data = data.append(df_tmp) data['季度']=data['季度'].apply(lambda x: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 return df df = fund_stock_holding(years,'005669') df
得到的數(shù)據(jù)表格如下:
上面的表格中,我需要將 基金代碼
這一列移動到 序號
這列的后面,由于 years = ['2019','2020','2021']
這是一個變量,當具體的值不同時,會導致列名稱不一樣,因此,在這種情況下我們不能直接使用列的具體名稱,但咱們可以通過 列的位置組合來實現(xiàn),列的調(diào)整具體如下:
cols = df.columns.tolist() cols = cols[:1] + cols[-1:] + cols[1:-1] # 將基金代碼列名放前面 df = df[cols]
將上面的調(diào)整過程整合到自定義函數(shù)中,完整的代碼如下:
# 需要安裝 akshare # pip install akshare years = ['2019','2020','2021'] def fund_stock_holding_update(years,code): data = pd.DataFrame() for yr in years: df_tmp = ak.fund_em_portfolio_hold(code=code,year=yr) data = data.append(df_tmp) data['季度']=data['季度'].apply(lambda x: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] return df df = fund_stock_holding_update(years,'005669') df
效果如下:
當然,我最后實現(xiàn)的效果是將基金代碼換成基金名稱,這個可以想辦法實現(xiàn),效果如下:
小結(jié)
以上就是關(guān)于 Pandas 中 列名稱排序的介紹,看似很簡單的內(nèi)容,在最后的實踐中,也還是有些小技巧的。
到此這篇關(guān)于Pandas實現(xiàn)列(column)排序的幾種方法的文章就介紹到這了,更多相關(guān)Pandas 列排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python numpy實現(xiàn)二維數(shù)組和一維數(shù)組拼接的方法
今天小編就為大家分享一篇Python numpy實現(xiàn)二維數(shù)組和一維數(shù)組拼接的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06python神經(jīng)網(wǎng)絡Keras實現(xiàn)GRU及其參數(shù)量
這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡Keras實現(xiàn)GRU及其參數(shù)量,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05在Mac OS上使用mod_wsgi連接Python與Apache服務器
這篇文章主要介紹了在Mac OS上使用mod_wsgi連接Python與Apache服務器的方法,同時文中還介紹了使用Python的Django框架時mod_wsgi連接方式下可能遇到的問題的一般解決方法,需要的朋友可以參考下2015-12-12在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
這篇文章主要介紹了在Mac OS上部署Nginx和FastCGI以及Flask框架的教程,Flask是Python下一個極簡的web開放框架,需要的朋友可以參考下2015-05-05windows系統(tǒng)下Python環(huán)境搭建教程
這篇文章主要為大家詳細介紹了windows系統(tǒng)下Python環(huán)境搭建教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03