文科生學Python系列12:Pandas進階(全美嬰兒姓名案例:plot圖)

第六課 - Pandas進階

本課剩余內容:

數據的分組和聚合

? ? ? ?pandas groupby 方法

? ? ? ?pandas agg 方法 ??

? ? ? ?pandas apply 方法

案例講解

? ? ? ?鳶尾花案例

? ? ? ?嬰兒姓名案

先來看作業6-1,第一次做作業不偷看答案啦!??

作業6-1:

1,計算每個品種鳶尾花各個屬性(花萼、花瓣的長度和寬度)的最小值、平均值又是分別是多少? (提示:使用min、mean 方法。)

2,計算鳶尾花每個品種的花萼長度(sepal_length) 大于6cm的數據個數。

讀題1,我去翻了一下上課的例子,有一個是求最大值的,那這個最小值,應該就是一樣的套路了:

最小值

一想,怎么樣把最小值和平均值放在同一個表格中呢?按理來說是可以的,一開始我還在想,是不是可以用前面幾節課學的 & 呢?不對,這節課老師沒有講到這個用法,再翻翻課上的例子,看到了重點句:

第6課課程上的例句

原來 agg函數是這樣用的,應用多個函數,用 agg 函數就可以同時召喚它們啦!(感覺上一篇文章白寫了??。。。)

然鵝。。。悲傷的事情又來了

接上滿屏的錯誤

一看到那么長,小白有點慌。。。然而,不熟練并眼瞎的人,看多兩眼發現,少了一個方括號!!!!其實第 15 條寫得很清楚,這個用法:

# 我們還可以同時應用多個函數,將函數名字放入一個列表即可,內置函數名需要用引號

里面應該劃下劃線的詞有“多個函數”,“列表”,“引號”。特么的列表啊媽蛋哪里會是圓括號啊!明明要方括號。

列表要方括號!

列表要方括號!

找平均值和最小值

第2題,有點難,我卡住了。先不做。。。我去作弊看別人做的作業,為啥就能用一句搞定!!!!我只能想到里面會有 iris / sepal_length / value_counts ,然后糾結要不要重新定義一個新的函數時,王同學的做法就是:iris.loc[iris['sepal_length']>6]["species"].value_counts()

讓我膜拜一下。。。


進入正題,這節課第2個案例:全美嬰兒姓名案例


一共137個文檔

是的,你沒看錯,下載137個文檔。

你們知道我在這里卡了多久嗎。。。原以為上一篇文章寫完,這篇會在第二天就能完成的。每一次!!只要是導入數據的時候!!!我都會被卡!!!這是第3遍了啊傻蛋!!!

我要解釋一下我這次是怎么栽的。。。

為什么我會那么清楚137個?

因為我是手動一個個下的,我算了一下,一個文檔下載需要點擊5次,137*5=865次。發了個朋友圈紀念一下不懂技術的恥辱。我一直以為我能找到那個一鍵下載的鍵,像這樣的:

一鍵下載

然而,我只看到了我的頁面是這樣的,菠蘿老師以為我能聽懂git pull是什么,然而我去搜索也是不懂操作:

我的頁面

我能怎么辦我也很絕望啊!!

我已經為了找快速下載137個文檔的方法,花了一個晚上加一個早上,我覺得這么浪費時間我的文章到下一節課都寫不出來的。最后無望地用40分鐘,一個個下載完成,然后在 jupyter 新建一個文件夾,用Upload方法,再次一個個點擊上載。

才有了最后和老師一樣的頁面。。。。老淚縱橫啊。。。多么不容易。全程傻瓜式操作,見證了我的智商。。呀。。。慘不忍睹

運行行

這里的內容比較豐富啊,來一句一句解釋內容代表什么,不知道你們到什么水平來,反正我是要細嚼慢咽慢慢理解的。

這是一份從1880年到2016年的數據,年份跨度就從1880-2016,注意右邊圓括號的2017啊不是2016啊!所以是 years=range(1880,2017)。

上課老師說 pieces=[ ] 是初始化一個列表來存儲每一年的數據時我聽著還挺懵,然而在跟著打碼的過程的中,以及老師講到后面這個表格的最后一步是把列表中所有DataFrame整合在一起的時候,我好像有點明白,這一步是把每一年的數據,都做成一個表格啊!然后有137個表格!!不過要操作之前,首先是要將這份137個文檔的數據放在和運行代碼同一個文件夾里面,方便數據的讀取。

由于這里有眾多數據文件,我們需要通過循環,來讀取文件。循環先開始,需要初始化一些變量,首先是年份years,整數的數列。設置每一列的名稱,用來儲存將來每一列的列名。每一列的屬性分別是 name , gender , frequency。接著可以用 for 循環來讀取每一年的數據了,這個循環用 year 來遍歷 years 里面的所有數值,也就是year 遍歷了從1880到2016年的所有整數: for year in years

path='names/yob%d.txt' % year,在循環中,首先要定義文件的路徑名 path,因為我們將數據存儲在 names的文件夾下,每一個文件名都是以yob 開頭的,緊跟著是一個年代,并以 .txt 結尾,記錄每一年的姓名數據,這樣就用一個通配符的形式,構造出每一個年代的文件名。這一段的說明我比較不能理解的是txt前面的小寫d,到底是干嘛用的,然后就是后面的% 是干嘛用的。哦~這種文科生什么都想去理解的習慣真是要改改了把。。。

然后我們就可以用 pd.read_csv 的方法來讀取數據,第一個參數path就是我們剛才定義的文件路徑了,第二個參數names等于上面剛剛定義的 columns,這就定義好了數據中每一列的名稱了。columns=[ 'names' , 'gender' , 'frequency' ]

frame[ 'year' ] =year : 要是我們需要在DataFrame中加多一列年份year,記錄里面的年份,這樣通過單個循環,在frame的變量中記錄某一年的所有數據,然后將每一年的數據添加到piece的列表中,這樣通過for 循環遍歷了每一年的數據,那就在列表pieces中存儲了所有數據: pieces.append(frame)

現在這些數據存儲的是一個個列表的形式,這里可以使用鏈接的 concat 方法將這些所有的數據整合在一塊,得到一個完整的數列。這里的ignore_index,代表可以忽略原有數據中的索引: baby_names = pd.concat(pieces, ignore_index=True 我的理解是,這一步把前面137個表格全部連在一起了,便于后面的輸出。

感覺說的轉述太多了。。。接上圖的代碼,我們來運行一下

baby_names.head( )

下面的這個演示,又讓我懷疑人生了

baby_names.info( )出錯了

左邊的是我運行的,右邊是老師運行的,要不是因為聽到老師說有差不多190萬行的時候我還不會去細看自己的數據,我的只有3萬多行啊老天!!剩下的180多萬行去哪里了!查看一下上面的代碼,也沒問題啊。我忍著疑惑,在kernel那里選擇restart and run all,重新從前面baby_names的定義開始,終于運行到這步,能夠和老師的同步了。。。。老淚縱橫呀!!

baby_names.info( )正確演示

老師又開始運用groupby 了,根據多個屬性來分組數據,比如根據年代和性別分組,計算每組數據的大小。也就是看在不同年代,不同性別的姓名數量有多少,即大家能起的名字有多少數量。

不同年代的姓名數量(1)
不同年代的姓名數量(2)

可以看出19世紀,可以選擇的姓名數量還是比較少的,只有1000多個左右,到了21世紀明顯選擇就多起來了,比19世紀增加了十幾倍。


在不同的年份不同性別中,計算每個名字所占的百分比

首先這是一個分組運算,在年份和性別進行分組,而要計算的百分比占比是沒有內置函數的,所以需要自己自定義函數進行運算

讀題理解的是,在年份不一樣的表格中,一個名字在這個年代,以及這個性別中,使用的頻率是多少。所以我們需要的數據是每一個姓名使用的總量,和在這一年且在這個性別中所有姓名使用的總量。

姓名使用頻率的前五行

在這個自定義函數中,我們有一個已經分組好的group可以直接用。我們在group中增加一個列名,定義為 pct ,用 group.frequency 取得每一個組姓名的頻率,然后用這個頻率除上所有使用頻率的總和,就能得到一個比例, *100 表示整個比例的單位。然后再用一個新的數據返回,return group。

函數定義好之后,需要的是運行行了,用第六課剛學的 groupby 函數來分出 year 年份和 gender 性別來分組,然后 apply 語法使用自定義計算占比的函數 add_pct 得出姓名的頻率,這個是在原來的數據中增加頻率新的一列。

加上排序rank的姓名使用頻率

rank可以得到根據頻次的占比情況。還是按照年份year 和性別 gender 進行分組,然后用 rank 函數,將函數進行排序,默認的排序是從小到大的,這里用ascending 將排序變成從大到小。排第一位的表示在那個年代最流行的名字,也就是使用頻率最高的名字。


每年最流行的男孩女孩名字所占的百分比變化趨勢如何?

思路:可以使用matlibplot畫出rank1的男孩女孩的名字每年所占總人數的百分比

使用Matplotlib工具繪圖

下面的線圖(line plot)由matlibplot實現,我們可以逐漸添加比如圖標題,x軸和y軸的標簽等等使圖形更加美觀。

首先,賦值定義:

每年最流行男孩名字(1)
每年最流行男孩名字(2)
每年最流行男孩名字(3)

從這個輸出可以看出,在19世紀的時候最流行的姓名是John,90年代流行的是Michael,到了21世紀是Jacob,到了2012年之后,流行的姓名是Noah,世界末日語言。。諾亞方舟。。。老師的結論是,姓名還是受文化趨勢的影響

haha接下來又是高潮了!!!、

plt.plot( rank1m.year, rank1m.pct )

plot函數代表選擇的是折線圖,橫坐標是年份,縱坐標是流行姓名的百分比。

我們來看看老師說的美化之后的圖,和上圖有什么不同,就是把線調整成藍色,然后把線的寬度設置得粗一點

加上 color=' blue', linewidth=2

仿佛聽到了圖問:“ 我美嗎 ?”。。。

美化圖表

圖問:“ 我很美是不是? ”

美化圖表

其實。。。真的有在變好看嗎。。。

通過 title 這個函數來定義函數的名稱,把需要的名稱用字符串的形式引起來,用 size 來定義字體的大小,color 定義字體顏色。

添加了標題的折線圖

最后這部分有3個內置函數,分別是 title, xlabel 和 ylabel,就是在定義的時候,表格的題目,x 軸和 y 軸的名稱都是已經標好位置的了,就差賦值了。

老師說,這個最后的圖表明,最流行的名字也是會隨著年份的增加隨之下降的。

男孩的部分完成了,來來來,在學習的你,打開jupyter 看著下圖做一下作業吧!先不要往下翻。

做題

我是往上翻的哈哈

下面第一圖我就不把全部po出來了,你們按照同樣的代碼去試試就可以得出一樣的結果了。

每年最流行的女孩姓名

名字趨勢圖:

名字趨勢圖


為什么歷史上最流行的男孩女孩名字所占的比重逐年降低?

想要解決一個問題,看思路分析先!

每年可選的名字數量series格式

要將上面的格式設置成DataFrame格式的話,進行下面的操作了

每年可選的名字數量DataFrame格式

這是關于年代和性別的層次索引,下列將這個索引變成DataFrame中的一列數據,可以使用reset_index。得到想要的數據后,將此數據存儲在 name_count ?的數據變量中,以供后面使用。

下面的作圖方法跟上面的套路是一樣一樣的,用布爾索引的方式取得name_count 中男孩的數據。然后繪制折線圖,橫坐標是年代,縱坐標是可選年代的名字數量。后面就是美化啦!(有點虛心說美化,真心不知道哪里好看了。。。)

男孩流行名字占比

這幅圖,老師說,可以看出,隨著年代的增加,可選姓名的數量也在增加,鵝。。畢竟大家詞匯量也在增加嘛??

下面的女孩姓名數據得出也是一樣的套路,一樣的結論~

女孩流行名字占比

結論:可選擇的名字逐年增加,所以流行名字的占比逐年降低

從數據中快速看到一個現象是我們學習數據分析的一個必要技能,讓數據告訴我們發生的現象。


作業6-2:

分別找出2015, 2016年最流行的前10個男孩和女孩名字, 想給自己起一個流行的英文名字的可以行動起來了。

提示:使用groupby().apply()

思路一,使用ranked這一列, 取其值小于等于10的數據

思路二,使用pct這一列,用sort_values方法對其排列大小,取最大的10行數據


選做作業:餐館小費數據分析

小費,指給予服務生消費額以外的賞錢,在美國餐館用餐完后通常會給服務生15-20%的小費。

這個數據是由Bryant和Smith于1995年所著的商務統計上的一個數據

分析什么因素會影響小費比例?

一個優秀的數據分析員一定是一個可以提出有意義問題的人

好的數據分析員往往可以根據商業背景提出一些假說,然后通過數據來驗證這些假說





周三對我來說簡直就是Deadline。。。緊張緊張,終于在新課前完成。這周卡的次數太多了,心里奔潰無數次,看到問題自己找不到去請教,多了之后有點不好意思,然后這次的代碼從頭開始重新打很多次,因為不知道哪里錯了,只能全部全新打,小白沒有更好的辦法了。

學習日記寫到現在,越寫越長,也想看看跟我一起學習的小伙伴,看我的文章,有沒有覺得哪里需要改進,哪里調整之后這份學習日記對需要的人更有價值?

歡迎各位留言或者私信給我喲!

謝謝你們的關注????

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,011評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,323評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,874評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,095評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,605評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,551評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,720評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,961評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,330評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,690評論 2 370

推薦閱讀更多精彩內容