一、concat、merge、join
concat方法可以在两个维度上拼接,默认纵向凭借(axis=0),拼接方式默认外连接
pd.concat(objs, axis=0, join='outer',
join_axes=None, ignore_index=False,
keys=None, levels=None, names=None,
verify_integrity=False, copy=True)
###
objs 需要连接的对象,eg [df1, df2]
axis axis = 0, 表示在水平方向(row)进行连接 axis = 1, 表示在垂直方向(column)进行连接
join outer, 表示index全部需要; inner,表示只取index重合的部分。**注意concat没有左连接或右连接。**
join_axes 传入需要保留的index
ignore_index 忽略需要连接的frame本身的index。当原本的index没有特别意义的时候可以使用
keys 可以给每个需要连接的df一个label
###
merge函数的作用是将两个pandas对象横向合并,遇到重复的索引项时会使用笛卡尔积,默认inner连接,可选left、outer、right连接。
pandas.merge(left, right,
how='inner', on=None,
left_on=None, right_on=None,
left_index=False, right_index=False,
sort=False, suffixes=('_x', '_y'),
copy=True, indicator=False,
validate=None)
###
left : DataFrame
right : DataFrame or named Series
how : {‘left’, ‘right’, ‘outer’, ‘inner’}, default ‘inner’(设置数据连接的集合操作规则)
left: 返回的结果只包含左列
right: 返回的结果只包含右列
inner: 交集
outer: 并集
on :label or list(此参数只有在两个DataFrame有共同列名的时候才可以使用)
left_on与right_on: label or list, or array-like(合并两个列名不同的数据集)
left_index与right_index : bool, default False(合并索引)
suffixes : tuple of (str, str), default ('_x', '_y')(为重复列名自定义后缀)
###
join函数作用是将多个pandas对象横向拼接,遇到重复的索引项时会使用笛卡尔积,默认左连接,可选inner、outer、right连接.它的效果与merge类似,但对于many_to_one模式下的合并,往往join更为方便。例:
left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'key': ['K0', 'K1', 'K0', 'K1']})
right = pd.DataFrame({'C': ['C0', 'C1'],
'D': ['D0', 'D1']},
index=['K0', 'K1'])
left.join(right, on='key')
####
result:
A B key C D
0 A0 B0 K0 C0 D0
1 A1 B1 K1 C1 D1
2 A2 B2 K0 C0 D0
3 A3 B3 K1 C1 D1
###
题目中任务4和任务5(拼接text_left_up和text_left_down,text_right_up和text_right_down)都要用到纵向拼接,因此只用merge和join不能完成目标,还需要配合pd.concat或者append。
二、groupby
首先按年龄对数据进行分类,然后统计不同年龄段的存活率。(改编自任务7)
注意bins的分类为左开右闭,比如年龄为5的小朋友将被分到0~5的组。因此,对于以下分组方法,如果有年龄为0的小朋友,则他将不会被分到任何组,显示为nan。
bins=[0,5,15,30,50,train['Age'].max()]
train['Age_group']=pd.cut(train['Age'],bins=bins,labels=['0~5','5~15','15~30','30~50','50~80'])
print(train['Survived'].groupby(train['Age_group']).sum()/train['Survived'].groupby(train['Age_group']).count())
####
result:
Age_group
0~5 0.697674
5~15 0.461538
15~30 0.358896
30~50 0.423237
50~80 0.343750
Name: Survived, dtype: float64
####
从以上结果可以看出,随着年龄的增大,存活率基本呈现下降的趋势。