Pandas的基礎操作:排序/設置行索引

剛剛使用Python進行數據分析,分享一些概念和想法,希望可以大家一起討論,如果理解或者表達有不準確的地方,請多多指點,不吝賜教,非常感謝~~

本文將介紹Pandas操作的最後一個部分,前兩篇分別是:
《Pandas的基礎操作:介紹/創建/查看數據/賦值》:https://blog.csdn.net/weixin_42969619/article/details/96863875
《Pandas的基礎操作:合併數據.merge()函數的使用》:https://blog.csdn.net/weixin_42969619/article/details/97132359


8. 排序:

(1)索引排序:data.sort_index()

應用場景:在使用sklean的時候,會將原數據隨機抽取一部分作爲“訓練集”,這是隨機抽取的結果就會打亂原數據的索引,當不需要改變索引,但是需要從新排序時

參數說明:
a. 參數axis:默認值爲0表示按行索引排序;axis=1時表示按列索引排序
b. 參數by:指定列名,默認值爲空
c. 參數ascending:默認值爲True表示正序;ascending=False時表示倒序
d. 參數inpalce:是否用排序後的數據集替換原來的數據,默認爲False,即不替換

以下列數據爲例:

data = pd.DataFrame({'A': ['food','fruit','food','fruit',
                         'food','water','food','fruit'],
                   'D': ['one','one','two','three',
                         'two','two','one','three'],
                   'C': np.random.randint(5,size=8),
                   'B': np.random.randn(8)})                  

在這裏插入圖片描述

  • axis=1時,按照列索引的大小排序,且ascending=True/inpalce=False
data.sort_index(axis=1) 

在這裏插入圖片描述

其中axis=0默認的情況即爲原始數據;沒有指定index所以系統自動生成從小到大的行索引
排序之後,重新打印data顯示原始數據,因爲參數inplace=False
  • 按照"D"和"C"列進行排序,且ascending=True/inpalce=False
data.sort_index(by="D")
data.sort_index(by=["D","C"])

在這裏插入圖片描述
在這裏插入圖片描述

需要注意的是:
a. 只對"D"排序的時候,按照字母順序:one>three>two
b. 對"D"和"C"一起排序的時候,是先排"D"列,如果"D"列中有重複值時,纔會根據"C"列內容排序
c. 排序之後,重新打印data顯示原始數據,因爲參數inplace=False
  • 按照列索引的大小排序即axis=1,但ascending=False且inpalce=True
data.sort_index(axis=1,ascending=False,inplace=True)
data

在這裏插入圖片描述

此時由於參數inpalce=True,所以修改的原數據,從新打印data時,是被操作過的數據

(2)按照某列的值進行排序:data.sort_values(by="X")

參數說明:
a. 參數by:指定列名,必填參數
b. 參數axis:默認值爲0表示按行索引排序;axis=1時表示按列索引排序
c. 參數ascending:默認值爲True表示正序;ascending=False時表示倒序
d. 參數inpalce:是否用排序後的數據集替換原來的數據,默認爲False,即不替換
e. 參數na_position:設定缺失值的顯示位置,可以選擇‘first’或‘last’

以上面數據data爲例,但是重新對其附一些空值

# 對5行0列的數字附空值;對“B”列中1,2行兩個值附空值
data.iat[5,0]=np.nan
data.loc[df.index[1:3],"B"]=np.nan
data

在這裏插入圖片描述

  • 按列"A"和"C"列進行排序,並設置na_position=“last”
data.sort_values(by=["A","C"],na_position="last")

在這裏插入圖片描述

9. 設定索引:

(1)將數據中的列作爲行索引:

data.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)

參數說明

a. 設置索引的參數是keys
b. append添加新索引
c. drop爲False時,成功設置了index,同時列數據中仍然保存着index字段
d. inplace爲True時,修改了原始數據

使用原始的data數據作爲例子:

  • 將"A"和"D"列作爲行索引
# 對比設置index順序不同的結果
df.set_index(keys=['A', 'D'])
df.set_index(keys=['D','A'])

在這裏插入圖片描述
在這裏插入圖片描述

可以看出來,雖然後者的操作後,看上去好像將"D"中重複的數據而"A"中不重複的數據進行堆疊,形成看似有“層級”關係的狀態;
但實際上仍然是在臨近數據有相同值時省略表示而已。
如果需要“層級”的表現,需要對數據進行更復雜操作

(2)還原索引:

應用場景:在使用contact等合併數據之後,index可能發生重複;或者在進行排序,刪除等操作時,index會發生順序混亂。這些不是我們希望的那樣,所以,除了對行索引排序以外,還可能需要對行索引進行重新設置

data.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill=”)

由於上面數據沒有辦法很好顯示出來“層級”的關係,所以重新創建數據,並以其作爲例子:

index = pd.MultiIndex.from_product([['TX', 'FL', 'CA'], ['North', 'South']], 
                                   names=['State', 'Direction'])
data1 = pd.DataFrame(index=index, data=np.random.randint(0, 10, (6,4)), columns=list('abcd'))

在這裏插入圖片描述

  • 沒有傳入任何參數,即drop=False時,默認是將全部級別的行索引都轉爲列數據,並使用一個RangeInddex來作爲新索引。
data1.reset_index()

在這裏插入圖片描述

效果等同於 data1.reset_index(level=[‘State’,’Direction’])
  • 使用level參數可以選擇指定的行索引
data1.reset_index(level=1) 
# or 
data1.reset_index(level=‘Direction’)

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章