复习:在前面我们已经学习了Pandas基础,知道利用Pandas读取csv数据的增删查改,今天我们要学习的就是探索性数据分析,主要介绍如何利用Pandas进行排序、算术计算以及计算描述函数describe()的使用。

1 第一章:探索性数据分析

开始之前,导入numpy、pandas包和数据

加载所需的库

import numpy as np import pandas as pd

载入之前保存的train_chinese.csv数据,关于泰坦尼克号的任务,我们就使用这个数据

df = pd.read_csv(“train_chinese.csv”)

1.6 了解你的数据吗?

教材《Python for Data Analysis》第五章

1.6.1 任务一:利用Pandas对示例数据进行排序,要求升序

具体请看《利用Python进行数据分析》第五章 排序和排名 部分

自己构建一个都为数字的DataFrame数据

‘’’ 我们举了一个例子 pd.DataFrame() :创建一个DataFrame对象 np.arange(8).reshape((2, 4)) : 生成一个二维数组(2*4),第一列:0,1,2,3 第二列:4,5,6,7 index=[2,1] :DataFrame 对象的索引列 columns=[‘d’, ‘a’, ‘b’, ‘c’] :DataFrame 对象的索引行 ‘’’ df2 = pd.DataFrame(data=np.arange(8).reshape((2,4)), index=[2,1], columns=[‘d’, ‘a’, ‘b’, ‘c’]) df2.head() df2.sort_index() |

  1. | d
  2. | a
  3. | b
  4. | c
  5. |

| —- | —- | —- | —- | —- |

  1. |
  2. 1
  3. | 4
  4. | 5
  5. | 6
  6. | 7
  7. |
  8. |
  9. 2
  10. | 0
  11. | 1
  12. | 2
  13. | 3
  14. |

【代码解析】
pd.DataFrame() :创建一个DataFrame对象
np.arange(8).reshape((2, 4)) : 生成一个二维数组(2*4),第一列:0,1,2,3 第二列:4,5,6,7
index=[‘2, 1] :DataFrame 对象的索引列
columns=[‘d’, ‘a’, ‘b’, ‘c’] :DataFrame 对象的索引行 【问题】:大多数时候我们都是想根据列的值来排序,所以将你构建的DataFrame中的数据根据某一列,升序排列

回答代码

df2.sort_values(“d”) |

  1. | d
  2. | a
  3. | b
  4. | c
  5. |

| —- | —- | —- | —- | —- |

  1. |
  2. 2
  3. | 0
  4. | 1
  5. | 2
  6. | 3
  7. |
  8. |
  9. 1
  10. | 4
  11. | 5
  12. | 6
  13. | 7
  14. |

【思考】通过书本你能说出Pandas对DataFrame数据的其他排序方式吗?
sort_index 【总结】下面将不同的排序方式做一个总结 1.让行索引升序排序

代码

df2.sort_index() 2.让列索引升序排序

代码

df2.sort_index(axis=1) |

  1. | a
  2. | b
  3. | c
  4. | d
  5. |

| —- | —- | —- | —- | —- |

  1. |
  2. 2
  3. | 1
  4. | 2
  5. | 3
  6. | 0
  7. |
  8. |
  9. 1
  10. | 5
  11. | 6
  12. | 7
  13. | 4
  14. |

3.让列索引降序排序

代码

df2.sort_index(axis=1, ascending=False) |

  1. | d
  2. | c
  3. | b
  4. | a
  5. |

| —- | —- | —- | —- | —- |

  1. |
  2. 2
  3. | 0
  4. | 3
  5. | 2
  6. | 1
  7. |
  8. |
  9. 1
  10. | 4
  11. | 7
  12. | 6
  13. | 5
  14. |

4.让任选两列数据同时降序排序

代码

df2.sort_values(by=[‘a’, ‘c’], ascending=False) |

  1. | d
  2. | a
  3. | b
  4. | c
  5. |

| —- | —- | —- | —- | —- |

  1. |
  2. 1
  3. | 4
  4. | 5
  5. | 6
  6. | 7
  7. |
  8. |
  9. 2
  10. | 0
  11. | 1
  12. | 2
  13. | 3
  14. |

1.6.2 任务二:对泰坦尼克号数据(trian.csv)按票价和年龄两列进行综合排序(降序排列),从这个数据中你可以分析出什么?

‘’’ 在开始我们已经导入了train_chinese.csv数据,而且前面我们也学习了导入数据过程,根据上面学习,我们直接对目标列进行排序即可 head(20) : 读取前20条数据

‘’’ df3 = df.sort_values(by=[“票价”, “年龄”],ascending=False).head(20) 【思考】排序后,如果我们仅仅关注年龄和票价两列。根据常识我知道发现票价越高的应该客舱越好,所以我们会明显看出,票价前20的乘客中存活的有14人,这是相当高的一个比例,那么我们后面是不是可以进一步分析一下票价和存活之间的关系,年龄和存活之间的关系呢?当你开始发现数据之间的关系了,数据分析就开始了。
当然,这只是我的想法,你还可以有更多想法,欢迎写在你的学习笔记中。 多做几个数据的排序

代码

df3.sort_values(“年龄”).loc[df3.是否幸存==0] |

  1. | 乘客ID
  2. | 是否幸存
  3. | 仓位等级
  4. | 姓名
  5. | 性别
  6. | 年龄
  7. | 兄弟姐妹个数
  8. | 父母子女个数
  9. | 船票信息
  10. | 票价
  11. | 客舱
  12. | 登船港口
  13. |

| —- | —- | —- | —- | —- | —- | —- | —- | —- | —- | —- | —- | —- |

  1. |
  2. 27
  3. | 28
  4. | 0
  5. | 1
  6. | Fortune, Mr. Charles Alexander
  7. | male
  8. | 19.0
  9. | 3
  10. | 2
  11. | 19950
  12. | 263.0000
  13. | C23 C25 C27
  14. | S
  15. |
  16. |
  17. 118
  18. | 119
  19. | 0
  20. | 1
  21. | Baxter, Mr. Quigg Edmond
  22. | male
  23. | 24.0
  24. | 0
  25. | 1
  26. | PC 17558
  27. | 247.5208
  28. | B58 B60
  29. | C
  30. |
  31. |
  32. 377
  33. | 378
  34. | 0
  35. | 1
  36. | Widener, Mr. Harry Elkins
  37. | male
  38. | 27.0
  39. | 0
  40. | 2
  41. | 113503
  42. | 211.5000
  43. | C82
  44. | C
  45. |
  46. |
  47. 438
  48. | 439
  49. | 0
  50. | 1
  51. | Fortune, Mr. Mark
  52. | male
  53. | 64.0
  54. | 1
  55. | 4
  56. | 19950
  57. | 263.0000
  58. | C23 C25 C27
  59. | S
  60. |
  61. |
  62. 557
  63. | 558
  64. | 0
  65. | 1
  66. | Robbins, Mr. Victor
  67. | male
  68. | NaN
  69. | 0
  70. | 0
  71. | PC 17757
  72. | 227.5250
  73. | NaN
  74. | C
  75. |
  76. |
  77. 527
  78. | 528
  79. | 0
  80. | 1
  81. | Farthing, Mr. John
  82. | male
  83. | NaN
  84. | 0
  85. | 0
  86. | PC 17483
  87. | 221.7792
  88. | C95
  89. | S
  90. |

写下你的思考

头等舱有14名年纪中青年的存活了,去世的是小于27的和大于64的。中青年或许更容易存活。

1.6.3 任务三:利用Pandas进行算术计算,计算两个DataFrame数据相加结果

具体请看《利用Python进行数据分析》第五章 算术运算与数据对齐 部分

自己构建两个都为数字的DataFrame数据

“”” 我们举了一个例子: frame1_a = pd.DataFrame(np.arange(9.).reshape(3, 3), columns=[‘a’, ‘b’, ‘c’], index=[‘one’, ‘two’, ‘three’]) frame1_b = pd.DataFrame(np.arange(12.).reshape(4, 3), columns=[‘a’, ‘e’, ‘c’], index=[‘first’, ‘one’, ‘two’, ‘second’]) frame1_a “””

代码

frame1_a = pd.DataFrame(np.arange(9.).reshape(3, 3), columns=[‘a’, ‘b’, ‘c’], index=[‘one’, ‘two’, ‘three’]) frame1_b = pd.DataFrame(np.arange(12.).reshape(4, 3), columns=[‘a’, ‘e’, ‘c’], index=[‘first’, ‘one’, ‘two’, ‘second’])

将frame_a和frame_b进行相加

代码

frame1_a + frame1_b |

  1. | a
  2. | b
  3. | c
  4. | e
  5. |

| —- | —- | —- | —- | —- |

  1. |
  2. first
  3. | NaN
  4. | NaN
  5. | NaN
  6. | NaN
  7. |
  8. |
  9. one
  10. | 3.0
  11. | NaN
  12. | 7.0
  13. | NaN
  14. |
  15. |
  16. second
  17. | NaN
  18. | NaN
  19. | NaN
  20. | NaN
  21. |
  22. |
  23. three
  24. | NaN
  25. | NaN
  26. | NaN
  27. | NaN
  28. |
  29. |
  30. two
  31. | 9.0
  32. | NaN
  33. | 13.0
  34. | NaN
  35. |

【提醒】两个DataFrame相加后,会返回一个新的DataFrame,对应的行和列的值会相加,没有对应的会变成空值NaN。 当然,DataFrame还有很多算术运算,如减法,除法等,有兴趣的同学可以看《利用Python进行数据分析》第五章 算术运算与数据对齐 部分,多在网络上查找相关学习资料。

1.6.4 任务四:通过泰坦尼克号数据如何计算出在船上最大的家族有多少人?

‘’’ 还是用之前导入的chinese_train.csv如果我们想看看在船上,最大的家族有多少人(‘兄弟姐妹个数’+‘父母子女个数’),我们该怎么做呢? ‘’’

代码

df[‘家族人数’] = df[‘兄弟姐妹个数’] + df[‘父母子女个数’] df.sort_values(‘家族人数’,ascending=False) |

  1. | 乘客ID
  2. | 是否幸存
  3. | 仓位等级
  4. | 姓名
  5. | 性别
  6. | 年龄
  7. | 兄弟姐妹个数
  8. | 父母子女个数
  9. | 船票信息
  10. | 票价
  11. | 客舱
  12. | 登船港口
  13. | 家族人数
  14. |

| —- | —- | —- | —- | —- | —- | —- | —- | —- | —- | —- | —- | —- | —- |

  1. |
  2. 180
  3. | 181
  4. | 0
  5. | 3
  6. | Sage, Miss. Constance Gladys
  7. | female
  8. | NaN
  9. | 8
  10. | 2
  11. | CA. 2343
  12. | 69.5500
  13. | NaN
  14. | S
  15. | 10
  16. |
  17. |
  18. 846
  19. | 847
  20. | 0
  21. | 3
  22. | Sage, Mr. Douglas Bullen
  23. | male
  24. | NaN
  25. | 8
  26. | 2
  27. | CA. 2343
  28. | 69.5500
  29. | NaN
  30. | S
  31. | 10
  32. |
  33. |
  34. 792
  35. | 793
  36. | 0
  37. | 3
  38. | Sage, Miss. Stella Anna
  39. | female
  40. | NaN
  41. | 8
  42. | 2
  43. | CA. 2343
  44. | 69.5500
  45. | NaN
  46. | S
  47. | 10
  48. |
  49. |
  50. 201
  51. | 202
  52. | 0
  53. | 3
  54. | Sage, Mr. Frederick
  55. | male
  56. | NaN
  57. | 8
  58. | 2
  59. | CA. 2343
  60. | 69.5500
  61. | NaN
  62. | S
  63. | 10
  64. |
  65. |
  66. 159
  67. | 160
  68. | 0
  69. | 3
  70. | Sage, Master. Thomas Henry
  71. | male
  72. | NaN
  73. | 8
  74. | 2
  75. | CA. 2343
  76. | 69.5500
  77. | NaN
  78. | S
  79. | 10
  80. |
  81. |
  82. ...
  83. | ...
  84. | ...
  85. | ...
  86. | ...
  87. | ...
  88. | ...
  89. | ...
  90. | ...
  91. | ...
  92. | ...
  93. | ...
  94. | ...
  95. | ...
  96. |
  97. |
  98. 499
  99. | 500
  100. | 0
  101. | 3
  102. | Svensson, Mr. Olof
  103. | male
  104. | 24.0
  105. | 0
  106. | 0
  107. | 350035
  108. | 7.7958
  109. | NaN
  110. | S
  111. | 0
  112. |
  113. |
  114. 194
  115. | 195
  116. | 1
  117. | 1
  118. | Brown, Mrs. James Joseph (Margaret Tobin)
  119. | female
  120. | 44.0
  121. | 0
  122. | 0
  123. | PC 17610
  124. | 27.7208
  125. | B4
  126. | C
  127. | 0
  128. |
  129. |
  130. 497
  131. | 498
  132. | 0
  133. | 3
  134. | Shellard, Mr. Frederick William
  135. | male
  136. | NaN
  137. | 0
  138. | 0
  139. | C.A. 6212
  140. | 15.1000
  141. | NaN
  142. | S
  143. | 0
  144. |
  145. |
  146. 195
  147. | 196
  148. | 1
  149. | 1
  150. | Lurette, Miss. Elise
  151. | female
  152. | 58.0
  153. | 0
  154. | 0
  155. | PC 17569
  156. | 146.5208
  157. | B80
  158. | C
  159. | 0
  160. |
  161. |
  162. 890
  163. | 891
  164. | 0
  165. | 3
  166. | Dooley, Mr. Patrick
  167. | male
  168. | 32.0
  169. | 0
  170. | 0
  171. | 370376
  172. | 7.7500
  173. | NaN
  174. | Q
  175. | 0
  176. |

891 rows × 13 columns 【提醒】我们只需找出”兄弟姐妹个数“和”父母子女个数“之和最大的数,当然你还可以想出很多方法和思考角度,欢迎你来说出你的看法。 max(df[‘兄弟姐妹个数’] + df[‘父母子女个数’]) 10#### 1.6.5 任务五:学会使用Pandas describe()函数查看数据基本统计信息函数查看数据基本统计信息)

(1) 关键知识点示例做一遍(简单数据)

具体请看《利用Python进行数据分析》第五章 汇总和计算描述统计 部分

自己构建一个有数字有空值的DataFrame数据

“”” 我们举了一个例子:

“”” frame2 = pd.DataFrame([[1.4, np.nan], [7.1, -4.5], [np.nan, np.nan], [0.75, -1.3] ], index=[‘a’, ‘b’, ‘c’, ‘d’], columns=[‘one’, ‘two’]) frame2 |

  1. | one
  2. | two
  3. |

| —- | —- | —- |

  1. |
  2. a
  3. | 1.40
  4. | NaN
  5. |
  6. |
  7. b
  8. | 7.10
  9. | -4.5
  10. |
  11. |
  12. c
  13. | NaN
  14. | NaN
  15. |
  16. |
  17. d
  18. | 0.75
  19. | -1.3
  20. |

调用 describe 函数,观察frame2的数据基本信息

代码

frame2.describe() |

  1. | one
  2. | two
  3. |

| —- | —- | —- |

  1. |
  2. count
  3. | 3.000000
  4. | 2.000000
  5. |
  6. |
  7. mean
  8. | 3.083333
  9. | -2.900000
  10. |
  11. |
  12. std
  13. | 3.493685
  14. | 2.262742
  15. |
  16. |
  17. min
  18. | 0.750000
  19. | -4.500000
  20. |
  21. |
  22. 25%
  23. | 1.075000
  24. | -3.700000
  25. |
  26. |
  27. 50%
  28. | 1.400000
  29. | -2.900000
  30. |
  31. |
  32. 75%
  33. | 4.250000
  34. | -2.100000
  35. |
  36. |
  37. max
  38. | 7.100000
  39. | -1.300000
  40. |

1.6.6 任务六:分别看看泰坦尼克号数据集中 票价、父母子女 这列数据的基本统计数据,你能发现什么?

‘’’ 看看泰坦尼克号数据集中 票价 这列数据的基本统计数据 ‘’’

代码

df[‘票价’].describe() count 891.000000 mean 32.204208 std 49.693429 min 0.000000 25% 7.910400 50% 14.454200 75% 31.000000 max 512.329200 Name: 票价, dtype: float64【思考】从上面数据我们可以看出,试试在下面写出你的看法。然后看看我们给出的答案。
当然,答案只是我的想法,你还可以有更多想法,欢迎写在你的学习笔记中。
票价波动很大,最大值和75%的值之间相差非常大。 【思考】有更多想法,欢迎写在你的学习笔记中。 【总结】本节中我们通过Pandas的一些内置函数对数据进行了初步统计查看,这个过程最重要的不是大家得掌握这些函数,而是看懂从这些函数出来的数据,构建自己的数据分析思维,这也是第一章最重要的点,希望大家学完第一章能对数据有个基本认识,了解自己在做什么,为什么这么做,后面的章节我们将开始对数据进行清洗,进一步分析。