Task03:数据重构

【目录】
第二章第二节:数据重构

  • 数据的合并
    • 方法一:concat-横向合并再纵向合并
    • 方法二:DataFrame自带的方法-join(横向)和append(纵向)结合
    • 方法三:使用Panads的merge方法(横向)和DataFrame的append方法(纵向)相结合
  • 换一种角度看数据-stack
  • 数据聚合与运算
    • 数据分组groupby
    • 数据运算

导库

    import pandas as pd
    import numpy as np

载入data文件中的:train-left-up.csv

text_left_up = pd.read_csv('E:/2021-11-14/Titanic数据/data/train-left-up.csv')
text_left_up.head(3)

载入所有数据

text_left_down = pd.read_csv('E:/2021-11-14/Titanic数据/data/train-left-down.csv')
text_right_up = pd.read_csv('E:/2021-11-14/Titanic数据/data/train-right-up.csv')
text_right_down = pd.read_csv('E:/2021-11-14/Titanic数据/data/train-right-down.csv')
text_left_down.head(3)

一、数据的合并

方法一:concat-横向合并再纵向合并

1.使用concat方法:将数据text-left-up.csv和text-right-up.csv横向合并为一张表,并保存这张表为result_up

result_up=pd.concat([text_left_up,text_right_up],axis=1)
result_up.head(3)

2.使用concat方法:将数据text-left-down.csv和text-right-down.csv横向合并为一张表,并保存这张表为result_down

result_down=pd.concat([text_left_down,text_right_down],axis=1)
result_down.head(3)

3.使用concat方法:将result_up和result_down纵向合并为result

result=pd.concat([result_up,result_down],axis=0,ignore_index=True)
result.head(3)

方法二:DataFrame自带的方法-join(横向)和append(纵向)结合

result_up_join=text_left_up.join(text_right_up)
result_down_join=text_left_down.join(text_right_down)
result_append=result_up_join.append(result_down_join)
result_append.head(3)

方法三:使用Panads的merge方法(横向)和DataFrame的append方法(纵向)相结合

result_up_merge = pd.merge(text_left_up,text_right_up,left_index=True,right_index=True)
result_down_merge = pd.merge(text_left_down,text_right_down,left_index=True,right_index=True)
result_merge_append = result_up_merge.append(result_down_merge)
result_merge_append.head(3)

对比merge、join以及concat的方法的不同以及相同:

  • 1.merge:横向拼接,数据库样式的联接合并,可以指定连接的键。
  • 2.join:横向拼接。
  • 3.concat:横向或纵向拼接都可以。

【注】:只使用merge和join方法做不了完整的合并,它们只能横向合并;必须结合append或者concat作纵向合并

保存合并后结果

result.to_csv('result.csv')
数据合并函数总结

方式 特点 用法示例
concat 通过行或列索引进行连接 pd.concat([df1,df2])
merge 通过字段进行连接 df1.merge(df2,on=‘A’)
append 追加,与axis=0的concat效果类似 df1.append(df2)
join 默认通过行索引连接 df1.join(df2)

concat参数总结:

  • pandas.concat(objs,axis=0,join=‘outer’,ignore_index=False,keys=None,levels=None, names=None,verify_integrity=False,sort=False,copy=True)
  • axis:连接方向,0为纵向(行拼接),1为横向(列拼接),默认axis=0
  • join:连接方式,left,right,outer,inner,默认outer。inner只显示非Nan数据
  • ignore_index:是否忽略索引,为True时重建索引
  • keys:建立层次化索引
  • names:层次化索引命名
  • verify_integrity:设置为True时,当出现重复索引会产生报错

merge参数总结:

  • DataFrame.merge(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)
  • right:连接的DataFrame
  • how:连接方式,left,right,outer,inner,默认outer。inner只显示非Nan数据
  • on:连接的键,如果两个DataFrame中要连接的字段名一样时使用
  • left_on/right_on:左右DataFrame中的连接键
  • left_index/right_index:通过索引链接
  • suffixes:指定连接之后DataFrame的相同字段的后缀名区分

append参数总结:

  • DataFrame.append(other,ignore_index=False,verify_integrity=False,sort=False)
  • ignore_index:是否忽略原有索引
  • verify_integrity:如果为True,当出现重复的索引时报错

join参数总结:

  • DataFrame.join(other, on=None, how=‘left’, lsuffix=’’, rsuffix=’’, sort=False)
  • on:指定DataFrame的连接字段,不作用于other
  • how:连接方式,left,right,outer,inner,默认outer。inner只显示非Nan数据
  • lsuffix/rsuffix:左(右)字段名的后缀,在两个DataFrame有重复字段名时必须设置

二、换一种角度看数据-stack

横纵转置

unit_result=result.stack().head(20)
unit_result.head(6)

将代码保存为unit_result,csv

unit_result.to_csv('unit_result.csv')

三、数据聚合与运算

result.head(3)

数据分组groupby

计算泰坦尼克号男性与女性的平均票价

Fare_Sex=result['Fare'].groupby(result['Sex']).mean()
Fare_Sex.head()

统计泰坦尼克号中男女的存活人数

survived_sex=result['Survived'].groupby(result['Sex']).sum()
survived_sex.head()

计算客舱不同等级的存活人数

survived_pclass=result['Survived'].groupby(result['Pclass']).sum()
survived_pclass
  • 分析:泰坦尼克号女性的平均票价高于男性,且女性的存活数更多

上述统计可以直接一步到位

result.groupby('Sex').agg({'Fare': 'mean', 'Survived': 'sum'}).rename(columns=
                            {'Fare': 'mean_fare', 'Survived': 'sum_survied'})

统计在不同等级的票中的不同年龄的船票花费的平均值

result.groupby(['Pclass','Age'])['Fare'].mean().head()

用for…in遍历

for name,group in result.groupby(['Age']):
    print(name)
    display(group.head())

根据奇偶行分组

result.groupby(lambda x:'奇数行' if not result.index.get_loc(x)%2==1 else '偶数行').groups
result.groupby(lambda x:'奇数行' if not result.index.get_loc(x)%2==1 else '偶数行').size()

将Fare_Sex和survived_sex数据合并,保存至sex_fare_survived.csv

result = pd.merge(Fare_Sex,survived_sex,on='Sex') #两个都为series才可以合并
result

result.to_csv('sex_fare_survived.csv')

聚合函数总结

  • mean/sum/size/count/std/var/sem/describe/first/last/nth/min/max

数据运算

计算存活人数最高的存活率(存活人数/总人数)
result.head(3)

计算不同年龄的总的存活人数

survived_age=result['Survived'].groupby(result['Age']).sum()
survived_age.head()

找出最大的年龄段

survived_age[survived_age.values==survived_age.max()]

  _sum=result['Survived'].sum()
    print(_sum)

_sum = result['Survived'].sum()

print("sum of person:"+str(_sum))

precetn =survived_age.max()/_sum

print("最大存活率:"+str(precetn))

sum of person:342
最大存活率:0.043859649122807015

浙ICP备19012682号