1. df.rank
df.rank針對指定的序列進行排序(從大到小或從小到大),並返回排名的序列(從第一名到最後一名)
rank有兩個重要參數:ascending、method。
- ascending:爲True時,表示按從小到大排列,即最小的爲第一名,最大的爲倒數第一名;ascending爲False,則相反
- method:主要控制當兩個數值相等時,如何排名。如考試得分,小明和小紅都考了100分,兩人都是第一名還是一個第一名,一個第二名。此時下一個得99分的是第三名,還是第二名呢?
- average:如下例,張三和李四並列第四名(同時佔據第四、第五兩個坑),那麼兩人的排名是4和5的平均值,下一個人是第6名
- max:如下例,張三和李四佔據第4、第5兩個坑,那麼兩人都是第5名(4/5較大排名那個),下一個人是第6名
- min:如下例,張三和李四佔據第4、第5兩個坑,那麼兩人都是第4名(4/5較小排名那個),下一個人是第6名
- dense:張三和李四並列第四名,但是下一個人是第5名
- first:張三和李四,誰先出現誰是第4名,另一個是第5名,下一個人是第6名
a = pd.Series([1, 2, 3, 4, 4, 6], index=['小明', '小紅', '小張', '張三', '李四', '王五'])
a.rank(ascending=True, method='first')
小明 1.0
小紅 2.0
小張 3.0
張三 4.0
李四 5.0
王五 6.0
dtype: float64
2. pd.pivot_table
pivot_table對應excel中的數據透視表。本章中所用df數據如下:
df.pivot_table有如下參數:
- values=None,
- index=None,
- columns=None,
- aggfunc=‘mean’,
- fill_value=None,
- margins=False,
- dropna=True,
- margins_name=‘All’,
- observed=False,
有些參數不常用就不贅述了,本章主要講述幾個很重要的參數
2.1 index
index即索引,其實透視圖就是分組後聚合,index就是按照指定的列分組並作爲index,其餘列進行聚合操作(其餘列應該爲剩下的所有列,爲什麼沒有月份一列呢,aggfunc時會講)。代碼、結果如下:
index也可以選擇兩列,設置多層索引,如下所示
2.2 aggfunc
上例中按照省份分組後,其餘列聚合,那麼是如何聚合呢,比如北京的土地,是將北京所有的土地求和嗎?aggfunc就是負責如何聚合的,是北京所有土地求和,還是求平均值等等。默認是mean,即上例是北京所有土地求平均值。
aggfunc的函數不一定是max,min, sum這種內置函數,也可以是自定義含義或者匿名函數
涉及種類時也可以是
aggfunc=lambda x: x.unique()
上例index中留下一個問題,爲什麼其餘列不包括月份,是因爲講述index時,aggfunc默認爲mean,而月份是字符串,不能進行mean操作,故沒有月份一列。
2.3 values
index選擇需要分組的列作爲索引,那麼values就是選擇對哪些列進行聚合操作。如針對省份進行分組,針對收入進行聚合操作
index和values都可以選擇多個
講述index時,沒有設置values,默認是其餘可以進行aggfunc操作的所有列
2.4 columns
index是針對每一行的名稱進行分組,那麼columns就是針對每一列的名稱進行分組,選後選擇需要進行聚合操作的列作爲values進行aggfunc操作。
比如index=‘省份’, columns=‘月份’, values='收入’即index爲省份的分組,columns爲月份的分組,進行aggfunc操作的爲收入的列。如北京1月的收入,北京2月的收入,具體如下:
同樣的columns也可以設置多列,即列爲多層。
2.5 fill_value&dropna
fill_value爲將NaN填充的數值:
dropna=True即刪除全部爲NaN的列,本例中不涉及,故不再展示
3. pd.read_excel
除了常用的io、sheet_name、header、index_col。其他常用的如(數據依然是上一章的df):
- skiprows:省略指定行的數據
原始數據有四個河北省數據,現在省略第1-4行,故讀出來的數據沒有河北省的數據
- name:指定列的名稱
發現列名不再是省份、月份、收入、土地,而是names指定的。
4. df添加行
4.1 append方法
df添加列很容易,但是行的話需要用append方法
這裏的other即新添加的值。
新添加的值可以是list of list、字典、Series、DataFrame。如果是list of list,則默認的index爲從0開始。
如果原始的df和other的index不一樣,如df列名爲A、B、C,新添加Series的index爲A、B、D。那麼,最終結果就會多一列D。
ignore_index爲True即新加一行的index不會和原來df的index相同。如果爲False則可能會和原來df的index相同。
特殊的,當Series有name時,ignore_index=False,則新加一行的index爲name,爲True時,新加一行的index爲其他(根據df的index確定)
總而言之,ignore_index很重要,有時ignore_index=False會報錯,爲True時不會報錯
下圖爲添加dataframe和concat操作有點像
4.2 concat方法
原始數據df是DataFrame,如果添加的是Series,就會出現如下情況
只有將a也變成DataFrame纔行
4.3 loc
新添加的一行index也可以自定義:
5. 調整df行列順序
無論行排序還是列排序,方法都是共用的。
- 方法1:sort_index
如果只是簡單按照行名或者列名排序,則使用
df.sort_index(axis=0)或df.sort_index(axis=1)
- 方法2:reindex(極力推薦)
reindex可以實現很多功能,先看下面的截圖
可以發現如果新的index和原來index相同,那麼就相當於實現了排序功能。無論新的index爲何,新得到的數據,只有len(新index)個;新index與原始數據相同的index數據會被複制過來;新index新出現的index,新結果會自動添加(填充何值由method決定);原始數據有某一個index,稱作a,但是新index沒有,則index a所指的數據就會被刪除。
但help以下reindex,會發現reindex的功能不止上述:
可以發現reindex有很多參數,比較重要的有labels、index、columns、axis, method。上述例子只有一個參數,故是指定了labels。下面從排序的角度講述這5個參數(假設新的索引和原始數據索引相同,等價於排序)
我們知道sort_index可以通過axis來實現對index排序還是對columns排序。其實reindex也一樣。
label+axis=0就實現了對index按照自己想要的順序進行重排的功能。其等效於單獨使用index(index不能與axis並用)
label+axis=1就實現了對columns按照自己想要的順序重排的功能。其等效於單獨使用columns(columns不能與axis並用)
method的具體用法詳見博客:https://blog.csdn.net/weixin_43178406/article/details/87460939 - 方法3:loc