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

作者: Lochaiching | 来源:发表于2017-09-11 21:01 被阅读399次

    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

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

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

    相关文章

      网友评论

      • 1391b55257ef:您在什么平台学习的?
        被螃蟹剥的壳:@Lochaiching 能发我一份吗?
        Lochaiching:@李博君 在新生大学,教学团队是解密大数据。不过现在课程下架了,记得是有课程学习意向表填,要是需要的话,我去找找发你。

      本文标题:Python数据分析答疑5:Pandas入门

      本文链接:https://www.haomeiwen.com/subject/prsfsxtx.html