Python数据分析答疑5:Pandas入门

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,代码运行出错


图1

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


图2

Q 2 :我给一个DataFrame按特定顺序排列;然后,我给一个DataFrame添加行标签,为什么值全都变成NaN了呢?DataFrame不是可以自动判定其格式吗?

对着课程和书看了好多遍,也找不到原因。求帮忙。

A1:是用DataFrame和Series的数据类型创建DataFrame是无法通过这种方式改变索引的,需要通过类似如下的方式修改:gdb_df.index = ['cn', 'us', ... ]
A2: 这是在赋值操作,而不是修改行索引。给一个DataFrame赋值的时候,不能用另一个DataFrame数据,而应该用字典。所以出错了。修改标签,就得按照老师上面的这种方法。


图3

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,以此作为布尔索引即可实现内容选择。


图4
图5

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访问的结果就不一样了啊。


图6

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的属性列,要最快访问,每一列的数据类型是相同的,但是要找每行的数据就会稍微麻烦点。总的来说和使用习惯有关吧。是不是感觉没听懂。记住这个用法就好了。


图7

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


图8

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 :确认下,文件和代码是否在同一文件夹下,以及文件名是否正确。


图9

Q 14 :为什么这里重新定义的colums没有大小写呢?

A :拼错了columns


图10

Q 15 :照着打代码的时候发现了两个问题,在图片里(图10)👆🏻能否帮我解答一下?谢谢~

A:shape(0,3)是不是表示就是空的了,把>10 换成>=再加上print试试。


图12

Q 16 :运行着GDP数据就出现NaN的问题,上一个表格都没有问题

A :‘GDP’这个字符改成小写,你应该是前面就是小写,这里的大写识别不出来。这里是使用gdb_df.columns的方式修改的,不是在创建的时候修改的,在创建的时候,需要和字典一致的,在创建之后呢?你就可以使用gdp_df.columns = []的形式对列名进行修改了。


图13

Q 17 :上面两个图(图13)所示,为何loc选列标签会有错误,但是选行标签却没问题

A :.loc[["us"]] 应该使用双中括号


图15

Q 18 : 图15,这里小括号行 ,  中括号为什么就不行呢?老是搞不清什么时候该中括号 ,什么时候该小括号。

A1:小括号是函数,中括号是定位

A2:()&()是讲and,or,not时,老师写的固定的表达法。我当定理记下来的,没必要研究那么细


图16
图17

Q 19 :上面两个图(图16,图17)所示,我这是哪里出问题了?

A:少了一个continent




今天整理的时候,遇到一个问题,跑去问老师,老师说,你到这个时候应该能够解答这个问题了。然而,我盯着它看十几分钟,脑子动不了。所以我放弃了那个问题。。。

唉 学习路上那个能力超强的怪兽又来了。。。祝我好运,多点耐心。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容