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. 選出亞洲或者北美洲的國家記錄 (提示:使用 isin 方法)
2. 選出gdp大于4兆億美元的國家
作業(yè)2:
使用鳶尾花數(shù)據(jù)集垦江,模仿老師課上的例子,完成如下作業(yè),
1. 畫出花萼寬度和長度的散點圖浪读,使用品種劃分數(shù)據(jù)
2. 畫出花萼的長度的箱線圖,使用品種劃分數(shù)據(jù)
作業(yè)3(選做):
根據(jù)今天課程學(xué)習(xí)內(nèi)容辛藻,對提供的 WordIndex.csv 數(shù)據(jù)進行簡單的查看和可視化分析碘橘。
注:數(shù)據(jù)已經(jīng)在第五課預(yù)習(xí)資料中提供,本題非常開放吱肌,大家可以從數(shù)據(jù)分析的角度痘拆,以文章的形式完成這項作業(yè)。提交文章鏈接即可氮墨。
利用課上已學(xué)知識纺蛆,完成一份數(shù)據(jù)分析文章。首先要了解這份數(shù)據(jù)的內(nèi)容规揪?然后可從自己關(guān)心的某些維度進行分析桥氏。最終得出結(jié)論。這個過程會很有趣的猛铅。
答疑Q&A目錄:
1字支,代碼運行理解
2,代碼運行出錯:NaN
3奸忽,代碼運行出錯
4堕伪,代碼運行理解:iloc/loc
5,代碼運行出錯
6栗菜,代碼運行出錯:SettingWithCopyWarning
7刃跛,代碼理解:dataframe
8,代碼運行出錯
9苛萎,代碼運行出錯
10桨昙,讀取文件
11检号,代碼理解:()/浮點數(shù)
12,代碼理解
13蛙酪,代碼出錯
14齐苛,代碼運行出錯
15,代碼運行出錯
16桂塞,代碼運行出錯:NaN
17凹蜂,代碼運行出錯
18,代碼理解:中擴號/圓括號
19阁危,代碼運行出錯
Q 1 :最后一題作業(yè)玛痊,有以下疑問(見圖):
1、圖是按照洲重新分類匯總后的數(shù)據(jù)狂打,對于GDP和人口擂煞,當(dāng)然可以直接sum,然對于Life_expectancy列趴乡,各洲的匯總數(shù)據(jù)对省,顯然應(yīng)該根據(jù)各國人口進行加權(quán)平均,生成新列晾捏,請問這個怎么弄蒿涎?
2、Y軸是人口數(shù)據(jù)惦辛,其label是'1e9'劳秋,但若顯示為‘十億’,會更直觀胖齐,請問如何改成這樣玻淑?
3、X軸是各洲GDP值匯總市怎,如何在X軸下端顯示具體的洲名岁忘,并能按照不同的顏色顯示?
4区匠、如果將X軸改為'continent‘干像,程序會報錯,請問是何原因驰弄?
第四問的報錯提醒:
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:問題1麻汰,可以采用如下方式計算:(worldIndex['Life_expectancy'] * worldIndex['Population']).sum() / wordIndex['Population'].sum().
還有如果想找GDP和人口之間關(guān)系,畫散點圖會更直觀戚篙,這里的GDB只是作為標簽五鲫,并沒有按數(shù)值展示。
問題2岔擂,pd的plot方法似乎不支持位喂,我再找找方法浪耘,有結(jié)果通知你。
問題3塑崖,直接使用將代碼中的y="GDB_per_capita"替換為y="Continent"
問題4七冲,continent的大小寫錯了。如錯誤提示 KeyError
Q 2 :我給一個DataFrame按特定順序排列规婆;然后澜躺,我給一個DataFrame添加行標簽,為什么值全都變成NaN了呢抒蚜?DataFrame不是可以自動判定其格式嗎掘鄙?
對著課程和書看了好多遍,也找不到原因嗡髓。求幫忙操漠。
A1:是用DataFrame和Series的數(shù)據(jù)類型創(chuàng)建DataFrame是無法通過這種方式改變索引的,需要通過類似如下的方式修改:gdb_df.index = ['cn', 'us', ... ]A2: 這是在賦值操作器贩,而不是修改行索引颅夺。給一個DataFrame賦值的時候朋截,不能用另一個DataFrame數(shù)據(jù)蛹稍,而應(yīng)該用字典。所以出錯了部服。修改標簽唆姐,就得按照老師上面的這種方法。
Q 3 :關(guān)于padas series判斷標簽是否在里面廓八,有個疑問:就是key值明明在series里面奉芦,怎么判定的結(jié)果還是false呢?
如上截圖(圖3)剧蹂,哪位高手看到解答下声功?
A:pandas Series不支持這種in方法,可以將其轉(zhuǎn)化為list宠叼,即 "Asia" in s.tolist() ?先巴,
或者使用pandas的==即可,s=="Asia"冒冬,返回的布爾型Series中如存在True伸蚯,即表示存在。
當(dāng)檢查多個元素是简烤,可以使用邏輯運算符 | 或者 isin剂邮,如下代碼:
s.Continent == "Asia" | s.Continent == "Afria"
s.Continent.isin(["Asia", "Afria"])
如上兩種方式都可獲取布爾型series,以此作為布爾索引即可實現(xiàn)內(nèi)容選擇横侦。
Q 4 :一個有趣的問題挥萌,如圖4和圖5:關(guān)于iloc跟loc選取行標簽的區(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顯示以洲匯總后的柱狀圖時,X軸設(shè)置為Continent后報錯的圖片(圖6).
注:列名拼寫沒有問題锯蛀,是從csv文件中復(fù)制的列名
A:直接使用cc.plot(kind='bar', figsize=(15, 8))灭衷。要是需要指定畫那個列的圖,使用如下形式:worldIndex.groupby('Continent').Population.sum().plot(kind="bar")
關(guān)于這里之所以沒有壽命和GDB是因為他們的數(shù)量太少旁涤,如果想顯示可以將每列轉(zhuǎn)化為百分比翔曲。
Q 6 :請問SettingWithCopyWarning警告是什么原因,該怎么解決這個問題呢劈愚?
另外瞳遍,這里的Warning已經(jīng)在pandas的源碼級了,可奇怪的是調(diào)用堆棧里為何沒有顯示觸發(fā)問題的代碼菌羽?這個能否通過某種設(shè)置顯示整個堆棧掠械?SettingWithCopyWarning報警的原因是新增的計算列不能在復(fù)制后的DataFrame里創(chuàng)建嗎?
重新改了下代碼注祖,將sum列在tradeLogData里添加就沒報警了
A1: 對的猾蒂,增加新列直接使用 tradeLogData['sum']= xxx 的形式。不能在copy視圖上添加新列是晨《遣ぃ可以在原始dataframe增加。
Q 7 :在第五課講述dataframe的gdp定義中罩缴,我有點困惑蚊逢。
gdp字典不是按照一條條記錄來做字典的key:value對,而是已每個記錄中的一個列作為鍵值對靴庆。當(dāng)然了时捌,讀到dataframe后顯示是對的,只是這么些有點反直覺炉抒。
請問這么寫是有什么原因么奢讨?還是因為dataframe的輸入需要?
A:其實兩種方式都可以,只不過還要是訪問行的key-value需要使用loc這個屬性來訪問拿诸。其實可以這樣理解扒袖,列是這個dataframe的屬性列,要最快訪問亩码,每一列的數(shù)據(jù)類型是相同的季率,但是要找每行的數(shù)據(jù)就會稍微麻煩點∶韫担總的來說和使用習(xí)慣有關(guān)吧飒泻。是不是感覺沒聽懂。記住這個用法就好了吏廉。
Q 8 : 在做5-1作業(yè)的時候泞遗,用布爾索引就出現(xiàn)這個問題(圖7)。不知道哪里錯了.
A:可以先仔細看下席覆,Continent那一列的變量類型史辙,數(shù)字型無法與字符型比較的。??可以看下錯誤的字面佩伤,不可用的類型比較聊倔。
Q 9 :在做5-3作業(yè)的時候出現(xiàn)TypeError: Empty 'DataFrame': no numeric data to plot 報錯,Google沒找到解決辦法
A:如果沒猜錯的話生巡,這里的Africa的DataFrame是空的耙蔑,原因:這行代碼中,Africa = df[df.Continent == "Africa "] "Africa"似乎多了一個空格障斋,其他幾行也是類似纵潦。確認下是不是這個錯誤徐鹤。
Q 10 :請問如何把文件和代碼放到一個文件夾里/第五課的數(shù)據(jù)怎么導(dǎo)入到python呢垃环?
A:和普通的文件操作是一樣的,可以拷貝至對應(yīng)的文件夾下返敬∷熳或者在notebook環(huán)境中有個upload功能,也可以實現(xiàn)文件的上傳劲赠。
Q 11 :大家知道為什么使用numpy創(chuàng)建二維數(shù)組要用兩個圓括號么涛目?
另外隨機的浮點數(shù)都是8位的是因為語言是64位的原因么?
A:里面的圓括號表示參數(shù)凛澎,這個參數(shù)是一個元組霹肝,可以回顧一下元組的表示方式。浮點數(shù)是8字節(jié)大小塑煎,每個字節(jié)8位沫换,也就是64位大小,和語言沒有直接關(guān)系最铁,主要和計算機有關(guān)讯赏,太深入的計算機知識可不用探究垮兑。
元組和列表中的元素可以是int值,想更詳細了解元組漱挎,可以看看這 https://www.w3cschool.cn/python/python-tuples.html
Q 12 :圖8系枪,pandas新增一列做法。
疑問1:gdp_df["rank"] = "Top5 GDP" 為何輸入這個磕谅,新增的數(shù)據(jù)是列而不是行私爷?而gdp_df[0]切片獲取的數(shù)據(jù)卻是每一行的數(shù)據(jù)
疑問2: 需要新添加一行數(shù)據(jù)應(yīng)該如何實現(xiàn)?含下面各項參數(shù)("country": "capital":"population":"gdp":"continent": )膊夹,發(fā)現(xiàn)對于字典來說当犯,add跟append都不支持。
A :疑問1:這個當(dāng)做規(guī)律記住就好了割疾,算是設(shè)計者方便大家的使用嚎卫。而沒有局限于某些固有的思維。
問題2:可以使用append實現(xiàn)宏榕,先將字段轉(zhuǎn)化為series的變量s拓诸,然后使用df = df.append(s),即可實現(xiàn)添加麻昼。
Q 13 :選做題讀取文件時出現(xiàn)問題:FileNotFoundError: File b'WorldIndex.csv' does not exist
A :確認下奠支,文件和代碼是否在同一文件夾下,以及文件名是否正確抚芦。
Q 14 :為什么這里重新定義的colums沒有大小寫呢倍谜?
A :拼錯了columns
Q 15 :照著打代碼的時候發(fā)現(xiàn)了兩個問題,在圖片里(圖10)????能否幫我解答一下叉抡?謝謝~
A:shape(0,3)是不是表示就是空的了尔崔,把>10 換成>=再加上print試試。
Q 16 :運行著GDP數(shù)據(jù)就出現(xiàn)NaN的問題褥民,上一個表格都沒有問題
A :‘GDP’這個字符改成小寫季春,你應(yīng)該是前面就是小寫,這里的大寫識別不出來消返。這里是使用gdb_df.columns的方式修改的载弄,不是在創(chuàng)建的時候修改的,在創(chuàng)建的時候撵颊,需要和字典一致的宇攻,在創(chuàng)建之后呢?你就可以使用gdp_df.columns = []的形式對列名進行修改了倡勇。
Q 17 :上面兩個圖(圖13)所示逞刷,為何loc選列標簽會有錯誤,但是選行標簽卻沒問題
A :.loc[["us"]] 應(yīng)該使用雙中括號
Q 18 : 圖15,這里小括號行 亲桥,? 中括號為什么就不行呢洛心?老是搞不清什么時候該中括號 ,什么時候該小括號题篷。
A1:小括號是函數(shù)词身,中括號是定位
A2:()&()是講and,or番枚,not時法严,老師寫的固定的表達法。我當(dāng)定理記下來的葫笼,沒必要研究那么細
Q 19 :上面兩個圖(圖16深啤,圖17)所示,我這是哪里出問題了路星?
A:少了一個continent
今天整理的時候溯街,遇到一個問題,跑去問老師洋丐,老師說呈昔,你到這個時候應(yīng)該能夠解答這個問題了。然而友绝,我盯著它看十幾分鐘堤尾,腦子動不了。所以我放棄了那個問題迁客。郭宝。。
唉 學(xué)習(xí)路上那個能力超強的怪獸又來了掷漱。粘室。。祝我好運切威,多點耐心育特。