复习:在前面我们已经学习了Pandas基础,知道利用Pandas读取csv数据的增删查改,今天我们要学习的就是探索性数据分析,主要介绍如何利用Pandas进行排序、算术计算以及计算描述函数describe()的使用。
1 第一章:探索性数据分析
开始之前,导入numpy、pandas包和数据
import numpy as np
import pandas as pd
train_data = pd.read_csv(r"train_chinese.csv")
train_data.head(3)
| 乘客ID | 是否幸存 | 乘客等级(1/2/3等舱位) | 乘客姓名 | 性别 | 年龄 | 堂兄弟/妹个数 | 父母与小孩个数 | 船票信息 | 票价 | 客舱 | 登船港口 |
---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
---|
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
---|
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
---|
1.6 了解你的数据吗?
教材《Python for Data Analysis》第五章
1.6.1 任务一:利用Pandas对示例数据进行排序,要求升序
'''
我们举了一个例子
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 对象的索引行
'''
df = pd.DataFrame(data = np.arange(8).reshape((2, 4)), index=[2, 1], columns=['d', 'a', 'b', 'c'])
df
【代码解析】
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中的数据根据某一列,升序排列
df.sort_index()
df.sort_index().sort_values(by = ["d"])
【总结】排序 pandas 支持三种排序方式:按索引标签排序,按列值排序,以及两者结合排序。 1、按索引标签排序 Series.sort_index()和DataFrame.sort_index(axis, ascending) 其中:
- axis可以选择是按行索引排序(0)还是列索引排序(1)
- ascending可以选择是升序(True)还是降序(False)
2、按列值排序 Series.sort_values()和DataFrame.sort_values(by = [“列名”]) 3、两者结合排序 DataFrame.sort_values(by = [“行名”, “列名”], ascending)
【拓展】复合行索引:如“a”列和“b”列共同构成行索引 1、设置复合行索引。 df.set_index(list(“ab”)) 2、按其中一个行索引排序。 df.sort_index(level = “a”)
1.让行索引升序排序
df = df.sort_index()
df
2.让列索引升序排序
df = df.sort_index(axis = 1)
df
3.让列索引降序排序
df = df.sort_index(axis = 1, ascending = False)
df
4.让任选两列数据同时降序排序
df = df.sort_values(by = ["d", "c"], ascending = False)
df
1.6.2 任务二:对泰坦尼克号数据(trian.csv)按票价和年龄两列进行综合排序(降序排列),从这个数据中你可以分析出什么?
在开始我们已经导入了train_chinese.csv数据,而且前面我们也学习了导入数据过程,根据上面学习,我们直接对目标列进行排序即可 head(20) : 读取前20条数据
train_data.head(3)
| 乘客ID | 是否幸存 | 乘客等级(1/2/3等舱位) | 乘客姓名 | 性别 | 年龄 | 堂兄弟/妹个数 | 父母与小孩个数 | 船票信息 | 票价 | 客舱 | 登船港口 |
---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
---|
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
---|
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
---|
train_data.sort_values(by = ["票价", "年龄"], ascending = False).head(20)
| 乘客ID | 是否幸存 | 乘客等级(1/2/3等舱位) | 乘客姓名 | 性别 | 年龄 | 堂兄弟/妹个数 | 父母与小孩个数 | 船票信息 | 票价 | 客舱 | 登船港口 |
---|
679 | 680 | 1 | 1 | Cardeza, Mr. Thomas Drake Martinez | male | 36.0 | 0 | 1 | PC 17755 | 512.3292 | B51 B53 B55 | C |
---|
258 | 259 | 1 | 1 | Ward, Miss. Anna | female | 35.0 | 0 | 0 | PC 17755 | 512.3292 | NaN | C |
---|
737 | 738 | 1 | 1 | Lesurer, Mr. Gustave J | male | 35.0 | 0 | 0 | PC 17755 | 512.3292 | B101 | C |
---|
438 | 439 | 0 | 1 | Fortune, Mr. Mark | male | 64.0 | 1 | 4 | 19950 | 263.0000 | C23 C25 C27 | S |
---|
341 | 342 | 1 | 1 | Fortune, Miss. Alice Elizabeth | female | 24.0 | 3 | 2 | 19950 | 263.0000 | C23 C25 C27 | S |
---|
88 | 89 | 1 | 1 | Fortune, Miss. Mabel Helen | female | 23.0 | 3 | 2 | 19950 | 263.0000 | C23 C25 C27 | S |
---|
27 | 28 | 0 | 1 | Fortune, Mr. Charles Alexander | male | 19.0 | 3 | 2 | 19950 | 263.0000 | C23 C25 C27 | S |
---|
742 | 743 | 1 | 1 | Ryerson, Miss. Susan Parker "Suzette" | female | 21.0 | 2 | 2 | PC 17608 | 262.3750 | B57 B59 B63 B66 | C |
---|
311 | 312 | 1 | 1 | Ryerson, Miss. Emily Borie | female | 18.0 | 2 | 2 | PC 17608 | 262.3750 | B57 B59 B63 B66 | C |
---|
299 | 300 | 1 | 1 | Baxter, Mrs. James (Helene DeLaudeniere Chaput) | female | 50.0 | 0 | 1 | PC 17558 | 247.5208 | B58 B60 | C |
---|
118 | 119 | 0 | 1 | Baxter, Mr. Quigg Edmond | male | 24.0 | 0 | 1 | PC 17558 | 247.5208 | B58 B60 | C |
---|
380 | 381 | 1 | 1 | Bidois, Miss. Rosalie | female | 42.0 | 0 | 0 | PC 17757 | 227.5250 | NaN | C |
---|
716 | 717 | 1 | 1 | Endres, Miss. Caroline Louise | female | 38.0 | 0 | 0 | PC 17757 | 227.5250 | C45 | C |
---|
700 | 701 | 1 | 1 | Astor, Mrs. John Jacob (Madeleine Talmadge Force) | female | 18.0 | 1 | 0 | PC 17757 | 227.5250 | C62 C64 | C |
---|
557 | 558 | 0 | 1 | Robbins, Mr. Victor | male | NaN | 0 | 0 | PC 17757 | 227.5250 | NaN | C |
---|
527 | 528 | 0 | 1 | Farthing, Mr. John | male | NaN | 0 | 0 | PC 17483 | 221.7792 | C95 | S |
---|
377 | 378 | 0 | 1 | Widener, Mr. Harry Elkins | male | 27.0 | 0 | 2 | 113503 | 211.5000 | C82 | C |
---|
779 | 780 | 1 | 1 | Robert, Mrs. Edward Scott (Elisabeth Walton Mc... | female | 43.0 | 0 | 1 | 24160 | 211.3375 | B3 | S |
---|
730 | 731 | 1 | 1 | Allen, Miss. Elisabeth Walton | female | 29.0 | 0 | 0 | 24160 | 211.3375 | B5 | S |
---|
689 | 690 | 1 | 1 | Madill, Miss. Georgette Alexandra | female | 15.0 | 0 | 1 | 24160 | 211.3375 | B5 | S |
---|
【思考】排序后,如果我们仅仅关注年龄和票价两列。根据常识我知道发现票价越高的应该客舱越好,所以我们会明显看出,票价前20的乘客中存活的有14人,这是相当高的一个比例,那么我们后面是不是可以进一步分析一下票价和存活之间的关系,年龄和存活之间的关系呢?当你开始发现数据之间的关系了,数据分析就开始了。
1.6.3 任务三:利用Pandas进行算术计算,计算两个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_b
( a b c
one 0.0 1.0 2.0
two 3.0 4.0 5.0
three 6.0 7.0 8.0,
a e c
first 0.0 1.0 2.0
one 3.0 4.0 5.0
two 6.0 7.0 8.0
second 9.0 10.0 11.0)
【总结】表格计算 1、df1 + df2,加,两个表格中相同行索引和相同列索引对应的元素相加,其他位置均为NaN 2、df1 * df2,减,两个表格中相同行索引和相同列索引对应的元素相减,其他位置均为NaN 3、df1 * df2,乘,两个表格中相同行索引和相同列索引对应的元素相乘,其他位置均为NaN 4、df1 / df2,除,两个表格中相同行索引和相同列索引对应的元素相除,其他位置均为NaN 5、df1 > df2,比较,当两个表格行索引与列索引均相同时才能比较,结果为对应位置两元素的比较结果
frame1_a + frame1_b
| a | b | c | e |
---|
first | NaN | NaN | NaN | NaN |
---|
one | 3.0 | NaN | 7.0 | NaN |
---|
second | NaN | NaN | NaN | NaN |
---|
three | NaN | NaN | NaN | NaN |
---|
two | 9.0 | NaN | 13.0 | NaN |
---|
【提醒】两个DataFrame相加后,会返回一个新的DataFrame,对应的行和列的值会相加,没有对应的会变成空值NaN
frame1_a - frame1_b
| a | b | c | e |
---|
first | NaN | NaN | NaN | NaN |
---|
one | -3.0 | NaN | -3.0 | NaN |
---|
second | NaN | NaN | NaN | NaN |
---|
three | NaN | NaN | NaN | NaN |
---|
two | -3.0 | NaN | -3.0 | NaN |
---|
frame1_a * frame1_b
| a | b | c | e |
---|
first | NaN | NaN | NaN | NaN |
---|
one | 0.0 | NaN | 10.0 | NaN |
---|
second | NaN | NaN | NaN | NaN |
---|
three | NaN | NaN | NaN | NaN |
---|
two | 18.0 | NaN | 40.0 | NaN |
---|
frame1_a / frame1_b
| a | b | c | e |
---|
first | NaN | NaN | NaN | NaN |
---|
one | 0.0 | NaN | 0.400 | NaN |
---|
second | NaN | NaN | NaN | NaN |
---|
three | NaN | NaN | NaN | NaN |
---|
two | 0.5 | NaN | 0.625 | NaN |
---|
frame1_a > frame1_a
| a | b | c |
---|
one | False | False | False |
---|
two | False | False | False |
---|
three | False | False | False |
---|
1.6.4 任务四:通过泰坦尼克号数据如何计算出在船上最大的家族有多少人?
max(train_data["堂兄弟/妹个数"] + train_data["父母与小孩个数"])
10
1.6.5 任务五:学会使用Pandas describe()函数查看数据基本统计信息
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
| one | two |
---|
a | 1.40 | NaN |
---|
b | 7.10 | -4.5 |
---|
c | NaN | NaN |
---|
d | 0.75 | -1.3 |
---|
调用 describe 函数,观察frame2的数据基本信息
DataFrame.describe(percentiles=None, include=None, exclude=None, datetime_is_numeric=False) 生成描述性统计数据,包括非空数个数、平均值、标准差、最小值(0%)、25%、50%、75%、最大值(100%) 其中
- percentiles 选择包含在输出中的百分位数,取值为列表
- include 要包含在结果中的数据类型,“all”(输入的所有列都将包含在输出中)或列表(符合指定类型的列才能统计)或None(包括所有数字列)
- exclude 不包含在结果中的数据类型,列表(符合指定类型的列不进行统计)或None(不排除)
- datetime_is_numeric 是否将日期时间 dtypes 视为数字
frame2.describe()
| one | two |
---|
count | 3.000000 | 2.000000 |
---|
mean | 3.083333 | -2.900000 |
---|
std | 3.493685 | 2.262742 |
---|
min | 0.750000 | -4.500000 |
---|
25% | 1.075000 | -3.700000 |
---|
50% | 1.400000 | -2.900000 |
---|
75% | 4.250000 | -2.100000 |
---|
max | 7.100000 | -1.300000 |
---|
1.6.6 任务六:分别看看泰坦尼克号数据集中 票价、父母子女 这列数据的基本统计数据,你能发现什么?
train_data[["票价", "父母与小孩个数"]].describe()
| 票价 | 父母与小孩个数 |
---|
count | 891.000000 | 891.000000 |
---|
mean | 32.204208 | 0.381594 |
---|
std | 49.693429 | 0.806057 |
---|
min | 0.000000 | 0.000000 |
---|
25% | 7.910400 | 0.000000 |
---|
50% | 14.454200 | 0.000000 |
---|
75% | 31.000000 | 0.000000 |
---|
max | 512.329200 | 6.000000 |
---|
【总结】本节中我们通过Pandas的一些内置函数对数据进行了初步统计查看,这个过程最重要的不是大家得掌握这些函数,而是看懂从这些函数出来的数据,构建自己的数据分析思维,这也是第一章最重要的点,希望大家学完第一章能对数据有个基本认识,了解自己在做什么,为什么这么做,后面的章节我们将开始对数据进行清洗,进一步分析。
|