剛剛使用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’)