這是書籍《Pandas Cookbook》書籍第06章的代碼復現,所有代碼運行在Jupyter Notebook上,原講解地址是:
https://www.jianshu.com/p/ab55e07418af
我上傳代碼的github地址是:
https://github.com/Asunqingwen/PandasCookbook.git
github上有該書中用到的data,里面代碼會不定期更新(因為工作原因,時間不定),直到本書學習完成!
相比原講解,會穿插一些自己的理解,水平有限,請各路大神指正。
文章目錄
- 1.檢查索引
- 2.求笛卡爾積
- 3.索引爆炸
- 4.用不等索引填充數值
- 5.從不同的DataFrame追加列
- 6.高亮每列的最大值
- 7.用鏈式方法重現idxmax
- 8.找到最常見的最大值
1.檢查索引
這段主要是將索引拿出來單獨講解,因為索引底層是numpy數組,所以很多操作類似于ndarray,比如支持[]運算,切片
有許多和Series以及DataFrame相同的方法,比如min,max,isnull等;也可以直接拼接字符串,進行索引修改;還有就是通過比較運算符,得到BOOL索引
索引雖然底層是ndarry,但是本質和tuple很像,其存儲對象是不可變類型,不能直接賦值修改
2.求笛卡爾積
第1部分說過索引支持集合運算,而笛卡爾積就是一種集合運算;笛卡爾積——https://baike.baidu.com/item/笛卡爾乘積/6323173?fromtitle=笛卡爾積&fromid=1434391, 這是百度百科的定義,如果按這個定義來,下圖s1和s2的笛卡爾積應該有24個結果,所以索引的笛卡爾積是和索引有關的——相同索引之間進行笛卡爾積,其余的都用缺失值NaN表示
如果兩組索引及其順序完全相同,那么“+”就變成了普通加法;如果索引相同,而順序不同,“+”還是表示笛卡爾積
3.索引爆炸
當對Series對象進行復制的時候,如果直接用“=”,則會將不同的對象名指向同一個對象,為了完全復制,必須用copy()函數
salary1和salary2雖然數據一樣,但是salary1索引排序后,兩個Series對象索引順序不一樣了,就可以和salary2做笛卡爾積運算了
從下圖可以看出,笛卡爾積運算使得內存占用量爆炸,所以要慎用“+”
4.用不等索引填充數值
用difference()函數可以將一個索引不同于另外一個索引的值區分出來,其實這就是集合運算里面的求差運算
這里的“+”就是笛卡爾積運算,使用add()函數以及它的fill_value參數,去除了缺失值
缺失值處理后,就沒有了缺失值;但是,如果一個索引值在兩個進行笛卡爾積的Series都是缺失值,那么add函數使用fill_value參數也無法去除該索引值對應的缺失值
利用highlight_null()函數對缺失值NaN進行高亮顯示
5.從不同的DataFrame追加列
每個部門的最高工資——對部門名進行升序排列,工資進行降序排列,那么每個部門的對應的第一個工資就是該部門的最高工資了
做比較運算,employee中沒有高于最高工資的工資
如果對最高工資不去重,那么會有多個相同索引值對應不同的最高工資,那么直接賦值給employee新的一列,就會出錯
選取沒有重復索引值的最高工資,那就可以正確的賦值給employee新的一列了
6.高亮每列的最大值
下面這段代碼算是導入數據的預處理——先做類型判斷,將可以轉為數值的列都轉為數值類型,最后刪除掉只有兩個值的列(可能因為二值類型,沒有求最大值的意義)
pd.options.display.max_rows = 8
#讀取college數據集,INSTNM作為列
college = pd.read_csv('data/college.csv',index_col='INSTNM')
college.dtypes
#MD_WNE_P10和GRAD_DEBT_MDN_SUPP兩列是對象類型,對其進行檢查,發現含有字符串
college.MD_EARN_WNE_P10.iloc[0]
college.GRAD_DEBT_MDN_SUPP.iloc[0]
#降序檢查
college.MD_EARN_WNE_P10.sort_values(ascending=False).head()
#可以用to_numeric,將某列的值做強制轉換
cols = ['MD_EARN_WNE_P10','GRAD_DEBT_MDN_SUPP']
for col in cols:
college[col] = pd.to_numeric(college[col],errors='coerce')
college.dtypes.loc[cols]
#用select_dtypes方法過濾出數值列
college_n = college.select_dtypes(include=[np.number])
college_n.head()
#有的列只含有兩個值,用nunique()方法挑出這些列
criteria = college_n.nunique() == 2
criteria.head()
#將BOOL Series傳給索引運算符,生成二元列的列表
binary_cols = college_n.columns[criteria].tolist()
binary_cols
#用drop方法刪除這些列
college_n2 = college_n.drop(labels=binary_cols,axis='columns')
college_n2.head()
用idxmax()方法選出每列最大值的行索引,用unique()方法選出不重復的列名
用highlight_max()函數高亮最大值行
不用[]運算符,直接調用highlight_max()函數,會高亮每一行的最大值
7.用鏈式方法重現idxmax
選出數值列,通過eq()函數獲得列最大值的BOOL DataFrame
選出至少包括一個True值的行,用any()函數——一行/一列至少有一個True,則返回True
一共18列,最多允許18個最大值,但實際有401個,因為很多列的最大值有很多
兩次累加,那么1只會出現在最大值首次出現的位置,那么用eq()函數和1比較,就能篩選出首次出現最大值的索引了
最大值16個,所得結果和idxmax()函數比較,是一樣的
兩種方法耗時比較,時間相差2倍左右
8.找到最常見的最大值
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
