8.23 第五課 Pandas入門
作業(yè)1:
使用如下代碼創(chuàng)建DataFrame,
gdp = {"country":["United States", "China", "Japan", "Germany", "United Kingdom"],
"capital":["Washington, D.C.", "Beijing", "Tokyo", "Berlin", "London"],
"population":[323, 1389, 127, 83, 66],
"gdp":[19.42, 11.8, 4.84, 3.42, 2.5],
"continent":["North America", "Asia", "Asia", "Europe", "Europe"]}
gdp_df = pd.DataFrame(gdp, columns = ["country", "capital", "population", "gdp", "continent"],
index = ["US", "CN", "JP", "DE", "UK"])
1. 選出亞洲或者北美洲的國(guó)家記錄 (提示:使用 isin 方法)
2. 選出gdp大于4兆億美元的國(guó)家
作業(yè)2:
使用鳶尾花數(shù)據(jù)集,模仿老師課上的例子,完成如下作業(yè),
1. 畫出花萼寬度和長(zhǎng)度的散點(diǎn)圖,使用品種劃分?jǐn)?shù)據(jù)
2. 畫出花萼的長(zhǎng)度的箱線圖,使用品種劃分?jǐn)?shù)據(jù)
作業(yè)3(選做):
根據(jù)今天課程學(xué)習(xí)內(nèi)容,對(duì)提供的 WordIndex.csv 數(shù)據(jù)進(jìn)行簡(jiǎn)單的查看和可視化分析。
注:數(shù)據(jù)已經(jīng)在第五課預(yù)習(xí)資料中提供,本題非常開放,大家可以從數(shù)據(jù)分析的角度,以文章的形式完成這項(xiàng)作業(yè)。提交文章鏈接即可。
利用課上已學(xué)知識(shí),完成一份數(shù)據(jù)分析文章。首先要了解這份數(shù)據(jù)的內(nèi)容?然后可從自己關(guān)心的某些維度進(jìn)行分析。最終得出結(jié)論。這個(gè)過程會(huì)很有趣的。
答疑Q&A目錄:
1,代碼運(yùn)行理解
2,代碼運(yùn)行出錯(cuò):NaN
3,代碼運(yùn)行出錯(cuò)
4,代碼運(yùn)行理解:iloc/loc
5,代碼運(yùn)行出錯(cuò)
6,代碼運(yùn)行出錯(cuò):SettingWithCopyWarning
7,代碼理解:dataframe
8,代碼運(yùn)行出錯(cuò)
9,代碼運(yùn)行出錯(cuò)
10,讀取文件
11,代碼理解:()/浮點(diǎn)數(shù)
12,代碼理解
13,代碼出錯(cuò)
14,代碼運(yùn)行出錯(cuò)
15,代碼運(yùn)行出錯(cuò)
16,代碼運(yùn)行出錯(cuò):NaN
17,代碼運(yùn)行出錯(cuò)
18,代碼理解:中擴(kuò)號(hào)/圓括號(hào)
19,代碼運(yùn)行出錯(cuò)

Q 1 :最后一題作業(yè),有以下疑問(見圖):
1、圖是按照洲重新分類匯總后的數(shù)據(jù),對(duì)于GDP和人口,當(dāng)然可以直接sum,然對(duì)于Life_expectancy列,各洲的匯總數(shù)據(jù),顯然應(yīng)該根據(jù)各國(guó)人口進(jìn)行加權(quán)平均,生成新列,請(qǐng)問這個(gè)怎么弄?
2、Y軸是人口數(shù)據(jù),其label是'1e9',但若顯示為‘十億’,會(huì)更直觀,請(qǐng)問如何改成這樣?
3、X軸是各洲GDP值匯總,如何在X軸下端顯示具體的洲名,并能按照不同的顏色顯示?
4、如果將X軸改為'continent‘,程序會(huì)報(bào)錯(cuò),請(qǐng)問是何原因?
第四問的報(bào)錯(cuò)提醒:
KeyError Traceback (most recent call last)
/Users/guizhijie/anaconda/lib/python3.6/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
2392 try:-> 2393 return self._engine.get_loc(key)
2394 except KeyError: pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc (pandas/_libs/index.c:5239)()
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc (pandas/_libs/index.c:5085)()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item (pandas/_libs/hashtable.c:20405)()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item (pandas/_libs/hashtable.c:20359)()
KeyError: 'continent'
A:?jiǎn)栴}1,可以采用如下方式計(jì)算:(worldIndex['Life_expectancy'] * worldIndex['Population']).sum() / wordIndex['Population'].sum().
還有如果想找GDP和人口之間關(guān)系,畫散點(diǎn)圖會(huì)更直觀,這里的GDB只是作為標(biāo)簽,并沒有按數(shù)值展示。
問題2,pd的plot方法似乎不支持,我再找找方法,有結(jié)果通知你。
問題3,直接使用將代碼中的y="GDB_per_capita"替換為y="Continent"
問題4,continent的大小寫錯(cuò)了。如錯(cuò)誤提示 KeyError

Q 2 :我給一個(gè)DataFrame按特定順序排列;然后,我給一個(gè)DataFrame添加行標(biāo)簽,為什么值全都變成NaN了呢?DataFrame不是可以自動(dòng)判定其格式嗎?
對(duì)著課程和書看了好多遍,也找不到原因。求幫忙。
A1:是用DataFrame和Series的數(shù)據(jù)類型創(chuàng)建DataFrame是無法通過這種方式改變索引的,需要通過類似如下的方式修改:gdb_df.index = ['cn', 'us', ... ]A2: 這是在賦值操作,而不是修改行索引。給一個(gè)DataFrame賦值的時(shí)候,不能用另一個(gè)DataFrame數(shù)據(jù),而應(yīng)該用字典。所以出錯(cuò)了。修改標(biāo)簽,就得按照老師上面的這種方法。

Q 3 :關(guān)于padas series判斷標(biāo)簽是否在里面,有個(gè)疑問:就是key值明明在series里面,怎么判定的結(jié)果還是false呢?
如上截圖(圖3),哪位高手看到解答下?
A:pandas Series不支持這種in方法,可以將其轉(zhuǎn)化為list,即 "Asia" in s.tolist() ?,
或者使用pandas的==即可,s=="Asia",返回的布爾型Series中如存在True,即表示存在。
當(dāng)檢查多個(gè)元素是,可以使用邏輯運(yùn)算符 | 或者 isin,如下代碼:
s.Continent == "Asia" | s.Continent == "Afria"
s.Continent.isin(["Asia", "Afria"])
如上兩種方式都可獲取布爾型series,以此作為布爾索引即可實(shí)現(xiàn)內(nèi)容選擇。


Q 4 :一個(gè)有趣的問題,如圖4和圖5:關(guān)于iloc跟loc選取行標(biāo)簽的區(qū)別。目的:同樣選取前四行
A:為此處的行索引就是數(shù)字索引。
再解釋下iloc和loc:iloc表示根據(jù)索引數(shù)字位置查找,而loc是根據(jù)索引的值來查找。比如如下series:
0 1
1 2
2 8
這里的索引是0 1 2,而這些索引的位置也是 0 1 2,所以采用loc和iloc的結(jié)果是一樣的。
如果有如下series:
us 1000
cn 2000
ua 2000
en 1000
這里的索引就是us cn ua en,而位置是0 1 2 3,使用iloc和loc訪問的結(jié)果就不一樣了啊。

Q 5 :WorldIndex顯示以洲匯總后的柱狀圖時(shí),X軸設(shè)置為Continent后報(bào)錯(cuò)的圖片(圖6).
注:列名拼寫沒有問題,是從csv文件中復(fù)制的列名
A:直接使用cc.plot(kind='bar', figsize=(15, 8))。要是需要指定畫那個(gè)列的圖,使用如下形式:worldIndex.groupby('Continent').Population.sum().plot(kind="bar")
關(guān)于這里之所以沒有壽命和GDB是因?yàn)樗麄兊臄?shù)量太少,如果想顯示可以將每列轉(zhuǎn)化為百分比。
Q 6 :請(qǐng)問SettingWithCopyWarning警告是什么原因,該怎么解決這個(gè)問題呢?
另外,這里的Warning已經(jīng)在pandas的源碼級(jí)了,可奇怪的是調(diào)用堆棧里為何沒有顯示觸發(fā)問題的代碼?這個(gè)能否通過某種設(shè)置顯示整個(gè)堆棧?SettingWithCopyWarning報(bào)警的原因是新增的計(jì)算列不能在復(fù)制后的DataFrame里創(chuàng)建嗎?
重新改了下代碼,將sum列在tradeLogData里添加就沒報(bào)警了
A1: 對(duì)的,增加新列直接使用 tradeLogData['sum']= xxx 的形式。不能在copy視圖上添加新列??梢栽谠糳ataframe增加。
Q 7 :在第五課講述dataframe的gdp定義中,我有點(diǎn)困惑。
gdp字典不是按照一條條記錄來做字典的key:value對(duì),而是已每個(gè)記錄中的一個(gè)列作為鍵值對(duì)。當(dāng)然了,讀到dataframe后顯示是對(duì)的,只是這么些有點(diǎn)反直覺。
請(qǐng)問這么寫是有什么原因么?還是因?yàn)閐ataframe的輸入需要?
A:其實(shí)兩種方式都可以,只不過還要是訪問行的key-value需要使用loc這個(gè)屬性來訪問。其實(shí)可以這樣理解,列是這個(gè)dataframe的屬性列,要最快訪問,每一列的數(shù)據(jù)類型是相同的,但是要找每行的數(shù)據(jù)就會(huì)稍微麻煩點(diǎn)。總的來說和使用習(xí)慣有關(guān)吧。是不是感覺沒聽懂。記住這個(gè)用法就好了。

Q 8 : 在做5-1作業(yè)的時(shí)候,用布爾索引就出現(xiàn)這個(gè)問題(圖7)。不知道哪里錯(cuò)了.
A:可以先仔細(xì)看下,Continent那一列的變量類型,數(shù)字型無法與字符型比較的。??可以看下錯(cuò)誤的字面,不可用的類型比較。
Q 9 :在做5-3作業(yè)的時(shí)候出現(xiàn)TypeError: Empty 'DataFrame': no numeric data to plot 報(bào)錯(cuò),Google沒找到解決辦法
A:如果沒猜錯(cuò)的話,這里的Africa的DataFrame是空的,原因:這行代碼中,Africa = df[df.Continent == "Africa "] "Africa"似乎多了一個(gè)空格,其他幾行也是類似。確認(rèn)下是不是這個(gè)錯(cuò)誤。
Q 10 :請(qǐng)問如何把文件和代碼放到一個(gè)文件夾里/第五課的數(shù)據(jù)怎么導(dǎo)入到python呢?
A:和普通的文件操作是一樣的,可以拷貝至對(duì)應(yīng)的文件夾下。或者在notebook環(huán)境中有個(gè)upload功能,也可以實(shí)現(xiàn)文件的上傳。
Q 11 :大家知道為什么使用numpy創(chuàng)建二維數(shù)組要用兩個(gè)圓括號(hào)么?
另外隨機(jī)的浮點(diǎn)數(shù)都是8位的是因?yàn)檎Z(yǔ)言是64位的原因么?
A:里面的圓括號(hào)表示參數(shù),這個(gè)參數(shù)是一個(gè)元組,可以回顧一下元組的表示方式。浮點(diǎn)數(shù)是8字節(jié)大小,每個(gè)字節(jié)8位,也就是64位大小,和語(yǔ)言沒有直接關(guān)系,主要和計(jì)算機(jī)有關(guān),太深入的計(jì)算機(jī)知識(shí)可不用探究。
元組和列表中的元素可以是int值,想更詳細(xì)了解元組,可以看看這 https://www.w3cschool.cn/python/python-tuples.html

Q 12 :圖8,pandas新增一列做法。
疑問1:gdp_df["rank"] = "Top5 GDP" 為何輸入這個(gè),新增的數(shù)據(jù)是列而不是行?而gdp_df[0]切片獲取的數(shù)據(jù)卻是每一行的數(shù)據(jù)
疑問2: 需要新添加一行數(shù)據(jù)應(yīng)該如何實(shí)現(xiàn)?含下面各項(xiàng)參數(shù)("country": "capital":"population":"gdp":"continent": ),發(fā)現(xiàn)對(duì)于字典來說,add跟append都不支持。
A :疑問1:這個(gè)當(dāng)做規(guī)律記住就好了,算是設(shè)計(jì)者方便大家的使用。而沒有局限于某些固有的思維。
問題2:可以使用append實(shí)現(xiàn),先將字段轉(zhuǎn)化為series的變量s,然后使用df = df.append(s),即可實(shí)現(xiàn)添加。
Q 13 :選做題讀取文件時(shí)出現(xiàn)問題:FileNotFoundError: File b'WorldIndex.csv' does not exist
A :確認(rèn)下,文件和代碼是否在同一文件夾下,以及文件名是否正確。

Q 14 :為什么這里重新定義的colums沒有大小寫呢?
A :拼錯(cuò)了columns

Q 15 :照著打代碼的時(shí)候發(fā)現(xiàn)了兩個(gè)問題,在圖片里(圖10)????能否幫我解答一下?謝謝~
A:shape(0,3)是不是表示就是空的了,把>10 換成>=再加上print試試。

Q 16 :運(yùn)行著GDP數(shù)據(jù)就出現(xiàn)NaN的問題,上一個(gè)表格都沒有問題
A :‘GDP’這個(gè)字符改成小寫,你應(yīng)該是前面就是小寫,這里的大寫識(shí)別不出來。這里是使用gdb_df.columns的方式修改的,不是在創(chuàng)建的時(shí)候修改的,在創(chuàng)建的時(shí)候,需要和字典一致的,在創(chuàng)建之后呢?你就可以使用gdp_df.columns = []的形式對(duì)列名進(jìn)行修改了。

Q 17 :上面兩個(gè)圖(圖13)所示,為何loc選列標(biāo)簽會(huì)有錯(cuò)誤,但是選行標(biāo)簽卻沒問題
A :.loc[["us"]] 應(yīng)該使用雙中括號(hào)

Q 18 : 圖15,這里小括號(hào)行 ,? 中括號(hào)為什么就不行呢?老是搞不清什么時(shí)候該中括號(hào) ,什么時(shí)候該小括號(hào)。
A1:小括號(hào)是函數(shù),中括號(hào)是定位
A2:()&()是講and,or,not時(shí),老師寫的固定的表達(dá)法。我當(dāng)定理記下來的,沒必要研究那么細(xì)


Q 19 :上面兩個(gè)圖(圖16,圖17)所示,我這是哪里出問題了?
A:少了一個(gè)continent
今天整理的時(shí)候,遇到一個(gè)問題,跑去問老師,老師說,你到這個(gè)時(shí)候應(yīng)該能夠解答這個(gè)問題了。然而,我盯著它看十幾分鐘,腦子動(dòng)不了。所以我放棄了那個(gè)問題。。。
唉 學(xué)習(xí)路上那個(gè)能力超強(qiáng)的怪獸又來了。。。祝我好運(yùn),多點(diǎn)耐心。