动手学数据分析 TASK3 数据重构
开始前,导入numpy、pandas包和数据
#导入基本库
import numpy as np
import pandas as pd
1
2
3
第二节 数据重构
数据的合并
2.4.1 载入数据观察数据间关系
left_up = pd.read_csv("data/train-left-up.csv")
left_down = pd.read_csv("data/train-left-down.csv")
right_up = pd.read_csv("data/train-right-up.csv")
right_down = pd.read_csv("data/train-right-down.csv")
1
2
3
4
观察数据可以发现各分数据分别代表原数据train.csv的左上,左下,右上、右下部分
2.4.2 使用concat方法 (axis=1表示横向列合并,默认即为纵向合并)
#横向合并
将数据train-left-up.csv和train-right-up.csv横向合并为一张表
>>>result_up = pd.concat([left_up,right_up],axis = 1)
将train-left-down和train-right-down横向合并为一张表
>>>result_down = pd.concat([left_down,right_down],axis = 1)
将上边的result_up和result_down纵向合并为result
>>>result = pd.concat([result_up,result_down])
>>>result.shape
(891,12)
1
2
3
4
5
6
7
8
9
10
11
2.4.3 使用DataFrame自带的方法join方法和append方法
#join:列横向合并 append:行纵向合并
up = left_up.join(right_up)
down = left_up.join(right_up)
result1 = up.append(down)
1
2
3
4
2.4.4 使用Pandas的merge方法和DataFrame的append方法
#merge本质上也是横向合并列,合并时需要有共同的列
up = pd.merge(left_up,rigth_up,left_index=True,right_index=True)
up.head()
1
2
3
>>>down=pd.merge(left_down,right_down,left_index = True,right_index = True)
>>>result2 = up.append(down)
>>>result2.shape
(891,12)
1
2
3
4
【总结】以上函数用法:
merge()和join()是横向拼接
concat()轴向连接,可以通过指定axis来改变拼接方向
append()是向dataframe对象中添加新的行,如果添加的列名不在dataframe对象中,将会被当作新的列进行添加
2.5 数据类型变换
2.5.1 将数据变成Series类型数据
#读取数据
data = pd.read_csv('result.csv')
data.head()
1
2
3
使用stack函数进行变换,转为Serie类型
参考博文讲到stack()的具体用法
stack()函数:将Dataframe数据变为Series类型的数据
stack即为堆叠,该函数即为实现输入数个数组不同方式的堆叠,返回堆叠后的1个数组。
参数:
arrays:用来作为堆叠的数个形状维度相等的数组
axis:即指定依照哪个维度进行堆叠,也就是指定哪种方式进行堆叠数组,默认axis=0(行)
输出:堆叠后的1个数组
>>>data_unit = data.stack()
>>>data_unit.head()
0 Unnamed: 0 0
PassengerId 1
Survived 0
Pclass 3
Name Braund, Mr. Owen Harris
dtype: object
1
2
3
4
5
6
7
8
2.6 数据聚合与运算
2.6.1 Groupby机制
Groupby主要用于数据聚合和分类计算,其思想是‘split-apply-combine’(拆分-应用-合并)
给出参考链接:
图解Pandas的groupby机制
超好用的 pandas 之 groupby
联想到SQL中也常用的groupby [SQL数据分析之 group by 的实现原理](https://zhuanlan.zhihu.com/p/86613661)
#以list形式查看分性别数据
>>>list(df.groupby('Sex'))[1] 男性
('male', Unnamed: 0 PassengerId Survived Pclass \
0 0 1 0 3
4 4 5 0 3
5 5 6 0 3
6 6 7 0 1
7 7 8 0 3
12 12 13 0 3
13 13 14 0 3
16 16 17 0 3
17 17 18 1 2
......
>>>list(df.groupby('Sex'))[0] 女性
('female', Unnamed: 0 PassengerId Survived Pclass \
1 1 2 1 1
2 2 3 1 3
3 3 4 1 1
8 8 9 1 3
9 9 10 1 2
10 10 11 1 3
11 11 12 1 1
14 14 15 0 3
......
#对按性别分的数据进行描述统计分析
group = df.groupby('Sex')
group.describe()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
按性别分析年龄变量
df.groupby('Sex')['Age'].describe()
1
2
2.6.2 计算泰坦尼克号男性与女性的平均票价
>>>df.groupyb('Sex')['Fare'].mean()
Sex
female 44.479818
male 25.523893
Name: Fare, dtype: float64
mean_fare_sex = df.groupby('Sex')['Fare'].mean()
1
2
3
4
5
6
7
2.6.3 统计泰坦尼克号中的男女存活人数
【提示】:表中的存活那一栏,可以发现如果还活着记为1,死亡记为0,因而计算存活人数即将数值加总即可
>>>df.groupby('Sex')['Survived'].sum()
Sex
female 233
male 109
Name: Survived, dtype: int64
>>>survived_sex = df.groupby('Sex')['Survived'].sum()
1
2
3
4
5
6
2.6.4 计算客舱不同等级的存活人数
>>>df.groupby('Pclass')['Survived'].sum()
Pclass
1 136
2 87
3 119
Name: Survived, dtype: int64
或
>>>df.groupby('Pclass')['Survived'].agg('sum')
#agg函数在功能上可以同时列举出多个条件
Pclass
1 136
2 87
3 119
Name: Survived, dtype: int64
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
【思考】从数据分析的角度来分析上述统计结果
泰坦尼克号的票价男性与女性的平均票女性较男性高;
泰坦尼克号女性的存活人数多余男性;
客舱不同等级的存活人数的排序为等级1>等级3>等级2。
【思考】上述第二第三小节中的运算可以通过agg()函数来同时计算。并且可以使用rename函数修改列名
#按性别来分 对存活人数求和,对票价求平均
df.groupby('Sex').agg({'Survived':'sum','Fare':'mean'}).rename(
columns = {'Survived':'Survived_sum','Fare':'Fare_mean'})
1
2
3
2.6.5 统计在不同等级的票中的不同年龄的船票花费的平均值
拆解开来“不同等级”+“不同年龄”——船票花费平均值
>>> df.groupby(['Pclass','Age'])['Fare'].mean().head(4)
Pclass Age
1 0.92 151.5500
2.00 151.5500
4.00 81.8583
11.00 120.0000
Name: Fare, dtype: float64
1
2
3
4
5
6
7
2.6.6 将任务二和任务三的数据合并,并保存到sex_fare_survived.csv
# 查看两份数据的索引属性
>>>mean_fare_sex.index
Index(['female', 'male'], dtype='object', name='Sex')
>>>survived_sex.index
Index(['female', 'male'], dtype='object', name='Sex')
#可以看到上面的两数据的index相同,故可以用merge函数
# 查看两份数据的类型
>>>type(mean_fare_sex)
pandas.core.series.Series
>>>type(survived_sex)
pandas.core.series.Series
#两份数据均为Series类型需要对数据进行转换
mean_fare_sex = mean_fare_sex.to_frame()
survived_sex = survived_sex.to_frame()
#用merge函数完成横向合并
pd.merge(mean_fare_sex,survived_sex,on = 'Sex')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2.6.7 得出不同年龄的总的存活人数,然后找出存活人数的最高的年龄,最后计算存活人数最高的存活率(存活人数/总人数)
# 得出不同年龄的总的存活人数
>>>df.groupby('Age')['Survived'].sum().head(8)
Age
0.42 1
0.67 1
0.75 2
0.83 2
0.92 1
1.00 5
2.00 3
3.00 5
Name: Survived, dtype: int64
survived_age = df.groupby('Age')['Survived'].sum()
>>>survived_age.values #查看值
array([ 1, 1, 2, 2, 1, 5, 3, 5, 7, 4, 2, 1, 2, 2, 0, 1, 1,
2, 3, 0, 4, 6, 6, 9, 9, 3, 0, 5, 11, 5, 0, 15, 0, 6,
6, 11, 7, 0, 8, 10, 0, 8, 9, 1, 6, 6, 0, 11, 11, 0, 1,
5, 5, 6, 0, 2, 6, 1, 3, 5, 0, 0, 1, 6, 4, 5, 2, 3,
1, 3, 1, 0, 2, 0, 3, 0, 2, 0, 2, 2, 0, 0, 0, 0, 0,
0, 0, 1], dtype=int64)
#找出存活人数的最高的年龄的位置
>>>survived_age.values == max(survived_age)
array([False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, True, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False])
#得到存活人数的最高的年龄
>>> survived_age[survived_age.values == max(survived_age)]
Age
24.0 15
Name: Survived, dtype: int64
# 存活总人数(即Survived列所有值加总)
>>>sum(df['Survived'])
342
#计算存活人数最高的存活率
>>>rate = max(survived_age) / sum(df['Survived'])
>>>rate
# 为了更直观地展现,我们用以下命令
>>>'最大存活率:{}'.format(rate)
'最大存活率:0.043859649122807015'
————————————————
版权声明:本文为CSDN博主「呲花椒的喵酱」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45409985/article/details/119837139