Python数据分析之数据重构

  • 本文为个人复现GitHub项目Hands-on data analysis第二章第二节的练习记录
  • 参考教材:《Python for Data Analysis》
  • 数据来源 Kaggle-Titanic,Hands-on data analysis


二、数据重构

2.4 数据的合并

  • 首先导入 data 文件夹里的文件
import numpy as np
import pandas as pd、
dflp = pd.read_csv('./data/train-left-up.csv')
dfrp = pd.read_csv('./data/train-right-up.csv')
dfld = pd.read_csv('./data/train-left-down.csv')
dfrd = pd.read_csv('./data/train-right-down.csv')

2.4.1 Concat 的使用

  • 将数据train-left-up.csv和train-right-up.csv横向合并为一张表,并保存这张表为result_up
  • 将train-left-down.csv和train-right-down.csv横向合并为一张表,并保存这张表为result_down。
result_up = pd.concat([dflp, dfrp], axis = 1)
result_down = pd.concat([dfld, dfrd], axis = 1)
  • 将上边的result_up和result_down纵向合并为result。
result = pd.concat([result_up, result_down])

2.4.2 join和append

  • 使用DataFrame自带的方法join方法和append完成上面的合并
# join 用于左右拼接
result1_up = dflp.join(dfrp)
result1_down = dfld.join(dfrd)

# append 用于上下拼接
result1 = result1_up.append(result1_down)

2.4.3 merge

  • 使用Panads的merge方法和DataFrame的append方法完成上面的合并
# merge 只能用于左右表拼接
Result_up = pd.merge(dflp, dfrp, left_index=True,right_index=True)
Result_down = pd.merge(dfld, dfrd, left_index=True,right_index=True)

# append 用于上下拼接
Result = Result_up.append(Result_down)

pd.merge()参数比较多,用法比较灵活,这边给出官方文档和解析:
pd.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’, ‘cross’}, default ‘inner’
    • left: leftouter join, 使用left frame的主键
    • right: rightouter join, 使用 right frame 的主键
    • outer: full outer join, 使用两个frame的主键,按字母顺序排序
    • inner: inner join, 使用两个frame的主键的交集,保持左键的顺序
    • cross: 从两个坐标系创建笛卡尔积,保持左键的顺序
  • on: 设定合并基准列,若on = None, 则默认为两个DataFrames中的列的交集
  • left_on 和right_on: 指定左右数据集的合并名称,有时左右数据集的索引名称相同,则可以设置left_on和right_on参数来合并两个数据集
  • left_index 和 right_index: 合并索引
  • sort: 若 sort = True, 则连接键按字母顺序排序,若sort = False, 则连接键按 ‘how’ 关键字排序
  • suffixes: 指示要添加到左边和右边重叠列名的后缀。传递值None而不是字符串,以指示左列名称或右列名称应按原样向左,不带后缀。
  • indicator: 若 indicator = True, 则新加名为’_merge’显示合并方式 (left_only, both, right_only)
  • suffixes: 连接方式,包括一对一,一对多,多对多

这篇写的挺好的:Pandas学习笔记六——合并数据集:连接(join)和合并(merge)操作

  • 保存数据
Resul.to_csv('result.csv', index = False)


2.5 不同数据类型的数据重构

2.5.1 DataFrame和Series类型的互换

1. DataFrame → Series: df.stack(), 把列旋转成行

text = pd.read_csv('result.csv')
text.head()
unit_result = text.stack()

Output:
Python数据分析之数据重构_第1张图片⚠️ 但数据保存后还是 DataFrame 格式

unit_result.to_csv('unit_result.csv')
test = pd.read_csv('unit_result.csv')
test.head()

Output:
Python数据分析之数据重构_第2张图片

2. Series → DataFrame: df.unstack(), 把行旋转成列

unit_result = unit_result.unstack()

Output:
Python数据分析之数据重构_第3张图片


数据重构之数据聚合与运算

2.6 数据运用

groupby的运用
《利用Python进行数据分析·第二版》第十章 数据聚合与分组运算

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

import numpy as np
import pandas as pd
df = pd.read_csv('./result.csv')

# 输出为Series类型
# 方法一
df.groupby('Sex')['Fare'].mean()
# 方法二
df1 = df['Fare'].groupby(df['Sex']).mean()

# 输出为DataFrame类型
# 方法一
df.groupby('Sex')[['Fare']].mean()
# 方法二
df1 = df[['Fare']].groupby(df['Sex']).mean()

⬇️ 以下输出类型均为Series

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

df2 = df.groupby('Sex')['Survived'].sum()

从 2.6.1 到 2.6.2 中,这些运算可以通过agg()函数来同时计算。并且可以使用rename函数修改列名

# 若公式'mean'或'sum'加上中括号(e.g. ['mean'], ['sum']),则表头会多出一行显示公式名称
# 输出类型为 DataFrame
# reset_index()可以解决主键与列名称不在一行的问题
num_agg = {'Fare':'mean', 'Survived': 'sum'}  
df.groupby('Sex').agg(num_agg).rename(columns={'Fare': 'mean_fare', 'Survived': 'sum_Survived'}).reset_index()

将2.6.1和2.6.2的数据合并,并保存到sex_fare_survived.csv

# merge可以合并Series类型的数据
# 输出类型为 DataFrame
sex_fare_survived = pd.merge(df1,df2,on='Sex').reset_index()
sex_fare_survived.to_csv('sex_fare_survived.csv', index = False)

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

df['Survived'].groupby(df['Pclass']).sum()

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

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

⬇️ 以下输出类型均为DataFrame
# 计算泰坦尼克号男性与女性的平均票价
dfd1 = df[['Fare']].groupby(df['Sex']).mean().reset_index()

# 统计泰坦尼克号中男女的存活人数
dfd2 = df.groupby('Sex')[['Survived']].sum()

# 合并数据
# join 可以合并 DataFrame类型的数据
dfd1_dfd2 = dfd1.join(dfd2)

2.6.5 得出不同年龄的总的存活人数,然后找出存活人数的最高的年龄,最后计算存活人数最高的存活率(存活人数/总人数)

age_survived = df.groupby('Age')['Survived'].sum()
ageSurvivedMax = age_survived.max()
survivedMax = ageSurvivedMax / df['Survived'].sum()
# output: 0.043859649122807015

你可能感兴趣的:(Python,数据分析,python,pandas,数据类型)