8.23 第五课 Pandas入门
作业1:
使用如下代码创建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兆亿美元的国家
作业2:
使用鸢尾花数据集,模仿老师课上的例子,完成如下作业,
1. 画出花萼宽度和长度的散点图,使用品种划分数据
2. 画出花萼的长度的箱线图,使用品种划分数据
作业3(选做):
根据今天课程学习内容,对提供的 WordIndex.csv 数据进行简单的查看和可视化分析。
注:数据已经在第五课预习资料中提供,本题非常开放,大家可以从数据分析的角度,以文章的形式完成这项作业。提交文章链接即可。
利用课上已学知识,完成一份数据分析文章。首先要了解这份数据的内容?然后可从自己关心的某些维度进行分析。最终得出结论。这个过程会很有趣的。
答疑Q&A目录:
1,代码运行理解
2,代码运行出错:NaN
3,代码运行出错
4,代码运行理解:iloc/loc
5,代码运行出错
6,代码运行出错:SettingWithCopyWarning
7,代码理解:dataframe
8,代码运行出错
9,代码运行出错
10,读取文件
11,代码理解:()/浮点数
12,代码理解
13,代码出错
14,代码运行出错
15,代码运行出错
16,代码运行出错:NaN
17,代码运行出错
18,代码理解:中扩号/圆括号
19,代码运行出错
Q 1 :最后一题作业,有以下疑问(见图):
1、图是按照洲重新分类汇总后的数据,对于GDP和人口,当然可以直接sum,然对于Life_expectancy列,各洲的汇总数据,显然应该根据各国人口进行加权平均,生成新列,请问这个怎么弄?
2、Y轴是人口数据,其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和人口之间关系,画散点图会更直观,这里的GDB只是作为标签,并没有按数值展示。
问题2,pd的plot方法似乎不支持,我再找找方法,有结果通知你。
问题3,直接使用将代码中的y="GDB_per_capita"替换为y="Continent"
问题4,continent的大小写错了。如错误提示 KeyError
Q 2 :我给一个DataFrame按特定顺序排列;然后,我给一个DataFrame添加行标签,为什么值全都变成NaN了呢?DataFrame不是可以自动判定其格式吗?
对着课程和书看了好多遍,也找不到原因。求帮忙。
A1:是用DataFrame和Series的数据类型创建DataFrame是无法通过这种方式改变索引的,需要通过类似如下的方式修改:gdb_df.index = ['cn', 'us', ... ]A2: 这是在赋值操作,而不是修改行索引。给一个DataFrame赋值的时候,不能用另一个DataFrame数据,而应该用字典。所以出错了。修改标签,就得按照老师上面的这种方法。
Q 3 :关于padas series判断标签是否在里面,有个疑问:就是key值明明在series里面,怎么判定的结果还是false呢?
如上截图(图3),哪位高手看到解答下?
A:pandas Series不支持这种in方法,可以将其转化为list,即 "Asia" in s.tolist() ,
或者使用pandas的==即可,s=="Asia",返回的布尔型Series中如存在True,即表示存在。
当检查多个元素是,可以使用逻辑运算符 | 或者 isin,如下代码:
s.Continent == "Asia" | s.Continent == "Afria"
s.Continent.isin(["Asia", "Afria"])
如上两种方式都可获取布尔型series,以此作为布尔索引即可实现内容选择。
Q 4 :一个有趣的问题,如图4和图5:关于iloc跟loc选取行标签的区别。目的:同样选取前四行
A:为此处的行索引就是数字索引。
再解释下iloc和loc:iloc表示根据索引数字位置查找,而loc是根据索引的值来查找。比如如下series:
0 1
1 2
2 8
这里的索引是0 1 2,而这些索引的位置也是 0 1 2,所以采用loc和iloc的结果是一样的。
如果有如下series:
us 1000
cn 2000
ua 2000
en 1000
这里的索引就是us cn ua en,而位置是0 1 2 3,使用iloc和loc访问的结果就不一样了啊。
Q 5 :WorldIndex显示以洲汇总后的柱状图时,X轴设置为Continent后报错的图片(图6).
注:列名拼写没有问题,是从csv文件中复制的列名
A:直接使用cc.plot(kind='bar', figsize=(15, 8))。要是需要指定画那个列的图,使用如下形式:worldIndex.groupby('Continent').Population.sum().plot(kind="bar")
关于这里之所以没有寿命和GDB是因为他们的数量太少,如果想显示可以将每列转化为百分比。
Q 6 :请问SettingWithCopyWarning警告是什么原因,该怎么解决这个问题呢?
另外,这里的Warning已经在pandas的源码级了,可奇怪的是调用堆栈里为何没有显示触发问题的代码?这个能否通过某种设置显示整个堆栈?SettingWithCopyWarning报警的原因是新增的计算列不能在复制后的DataFrame里创建吗?
重新改了下代码,将sum列在tradeLogData里添加就没报警了
A1: 对的,增加新列直接使用 tradeLogData['sum']= xxx 的形式。不能在copy视图上添加新列。可以在原始dataframe增加。
Q 7 :在第五课讲述dataframe的gdp定义中,我有点困惑。
gdp字典不是按照一条条记录来做字典的key:value对,而是已每个记录中的一个列作为键值对。当然了,读到dataframe后显示是对的,只是这么些有点反直觉。
请问这么写是有什么原因么?还是因为dataframe的输入需要?
A:其实两种方式都可以,只不过还要是访问行的key-value需要使用loc这个属性来访问。其实可以这样理解,列是这个dataframe的属性列,要最快访问,每一列的数据类型是相同的,但是要找每行的数据就会稍微麻烦点。总的来说和使用习惯有关吧。是不是感觉没听懂。记住这个用法就好了。
Q 8 : 在做5-1作业的时候,用布尔索引就出现这个问题(图7)。不知道哪里错了.
A:可以先仔细看下,Continent那一列的变量类型,数字型无法与字符型比较的。😊可以看下错误的字面,不可用的类型比较。
Q 9 :在做5-3作业的时候出现TypeError: Empty 'DataFrame': no numeric data to plot 报错,Google没找到解决办法
A:如果没猜错的话,这里的Africa的DataFrame是空的,原因:这行代码中,Africa = df[df.Continent == "Africa "] "Africa"似乎多了一个空格,其他几行也是类似。确认下是不是这个错误。
Q 10 :请问如何把文件和代码放到一个文件夹里/第五课的数据怎么导入到python呢?
A:和普通的文件操作是一样的,可以拷贝至对应的文件夹下。或者在notebook环境中有个upload功能,也可以实现文件的上传。
Q 11 :大家知道为什么使用numpy创建二维数组要用两个圆括号么?
另外随机的浮点数都是8位的是因为语言是64位的原因么?
A:里面的圆括号表示参数,这个参数是一个元组,可以回顾一下元组的表示方式。浮点数是8字节大小,每个字节8位,也就是64位大小,和语言没有直接关系,主要和计算机有关,太深入的计算机知识可不用探究。
元组和列表中的元素可以是int值,想更详细了解元组,可以看看这 https://www.w3cschool.cn/python/python-tuples.html
Q 12 :图8,pandas新增一列做法。
疑问1:gdp_df["rank"] = "Top5 GDP" 为何输入这个,新增的数据是列而不是行?而gdp_df[0]切片获取的数据却是每一行的数据
疑问2: 需要新添加一行数据应该如何实现?含下面各项参数("country": "capital":"population":"gdp":"continent": ),发现对于字典来说,add跟append都不支持。
A :疑问1:这个当做规律记住就好了,算是设计者方便大家的使用。而没有局限于某些固有的思维。
问题2:可以使用append实现,先将字段转化为series的变量s,然后使用df = df.append(s),即可实现添加。
Q 13 :选做题读取文件时出现问题:FileNotFoundError: File b'WorldIndex.csv' does not exist
A :确认下,文件和代码是否在同一文件夹下,以及文件名是否正确。
Q 14 :为什么这里重新定义的colums没有大小写呢?
A :拼错了columns
Q 15 :照着打代码的时候发现了两个问题,在图片里(图10)👆🏻能否帮我解答一下?谢谢~
A:shape(0,3)是不是表示就是空的了,把>10 换成>=再加上print试试。
Q 16 :运行着GDP数据就出现NaN的问题,上一个表格都没有问题
A :‘GDP’这个字符改成小写,你应该是前面就是小写,这里的大写识别不出来。这里是使用gdb_df.columns的方式修改的,不是在创建的时候修改的,在创建的时候,需要和字典一致的,在创建之后呢?你就可以使用gdp_df.columns = []的形式对列名进行修改了。
Q 17 :上面两个图(图13)所示,为何loc选列标签会有错误,但是选行标签却没问题
A :.loc[["us"]] 应该使用双中括号
Q 18 : 图15,这里小括号行 , 中括号为什么就不行呢?老是搞不清什么时候该中括号 ,什么时候该小括号。
A1:小括号是函数,中括号是定位
A2:()&()是讲and,or,not时,老师写的固定的表达法。我当定理记下来的,没必要研究那么细
Q 19 :上面两个图(图16,图17)所示,我这是哪里出问题了?
A:少了一个continent
今天整理的时候,遇到一个问题,跑去问老师,老师说,你到这个时候应该能够解答这个问题了。然而,我盯着它看十几分钟,脑子动不了。所以我放弃了那个问题。。。
唉 学习路上那个能力超强的怪兽又来了。。。祝我好运,多点耐心。