动手学数据分析 TASK1 数据加载及探索性数据分析

本文通过Kaggle上的泰坦尼克数据集,介绍数据分析流程及Jupyter Notebook使用,包括数据加载、初步观察、数据处理。重点讲解了Pandas库的DataFrame和Series数据类型,展示了如何读取、筛选、排序数据,以及描述性统计分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该博文用于记录Datewhale-2021.8月组队学习-动手学数据分析 学习过程的要点,通过kaggle网站上泰坦尼克的任务为例实现数据分析全流程,同时熟悉Jupyter Notebook的基本操作

1 第一节:数据载入及初步观察

1.1 载入数据

数据集来源: https://www.kaggle.com/c/titanic/overview
下载得到’ train ’ ’ gender_submission '和 ’ test_1 '三份文件

任务一:导入python库
import numpy as np
import pandas as pd
import os
from matplotlib import pyplot as plt

*注:import numpy和from numpy import 的区别

两种方式都是引入numpy库中的所有函数、函数、对象、变量等,两者的区别在于调用其中内容时不同。
import numpy,则后续使用该库下的属性都需要在前面加上numpy
from numpy import *,则不需要加入。以调用numpy中的random模块为例,第一种方式要用numpy.random,第二种方式只用random即可,一般推荐使用第一种方式

任务二:载入数据

(1) 使用相对路径载入数据
(2) 使用绝对路径载入数据

# 相对路径和绝对路径
df = pd.read_csv('train.csv')
df = pd.read_csv('E:\\jupyter\\workspace\\train.csv')

相对路径载入报错时,尝试使用os.getcwd()查看当前工作目录。

# 查看绝对路径
path = os.path.abspth('train.csv')

【思考】 数据加载 pd.read_csv()和pd.read_table()的不同

read_csv和read_table都是加载带分隔符的数据,每一个分隔符作为一个数据的标志,但二者读出的数据格式不一样,read_table是以制表符\t作为数据的标志,也就是以行为单位进行存储,而read_csv是数据之间以’,'逗号分隔。
tip:可以把默认的分隔符改为逗号从而使两者等价

pd.read_table(path,sep = ',')
任务三:逐块读取数据

每1000行为一个数据模块,逐块读取

df = pd.read_csv('train.csv',chunksize = 1000)

这时我们想要查看表格的前几行,可以看到使用chunksize赋值之后 df的数据类型变成textfilereader之后head方法不再适用,需要用到命令df.get_chunk()
在这里插入图片描述

任务四:将表头改成中文,索引改为乘客ID
# 法一
df = pd.read_csv('train.csv')
df.columns = ['乘客ID','是否幸存','乘客等级(1/2/3等舱位)','乘客姓名','性别','年龄','堂兄弟/妹个数','父母与小孩个数','船票信息','票价','客舱','登船港口']
df

# 法二
也可以在读取文件的时候直接重命名
df = pd.read_csv('train.csv',names = ['乘客ID','是否幸存','乘客等级(1/2/3等舱位)','乘客姓名','性别','年龄','堂兄弟/妹个数','父母与小孩个数','船票信息','票价','客舱','登船港口'])
df

法一即将原英文列名替换为中文,而法二是在原英文表头的上方再加上一行中文表头,原英文表头作为第一行数据,可以后续删除该行

数据的初步观察

任务: 查看数据的基本信息
df.info()  #查看数据类型结构

在这里插入图片描述

df.describe()

在这里插入图片描述
DataFrame的基础属性
df.shape ——行数 列数
df.dtypes——列数据类型
df.ndim ——数据维度
df.index——行索引
df.columns——列索引
df.values——对象值,二维ndarray数组

DataFrame整体情况

df.head(10)——显示前10行,默认是5行
df.tail()——显示末尾几行,默认是5
df.info()——相关系数,如行数,列数,列索引、列非空值个数,列类型,内存占用
df.describe()——快速统计结果,计数、均值、标准差、最大值、四分数、最小值
df.isnull()——判断数据是否为空,为空的地方返回True,其余地方返回False

1.3 保存数据

1.3.1 将数据在工作目录下保存为一个新文件
# 注意:不同的操作系统保存下来可能会有乱码,大家可以加入`encoding='GBK' 或者 ’encoding = ’utf-8‘‘`
encoding = 'utf-8'
df.to_csv('train_chinese.csv')

第二节:Pandas基础课程

1.4 Pandas中的两种数据类型

1.4.1 了解Dataframe与Series

Series是带标签的一维数组,可存储整数、浮点数、字符串、python对象登类型的数据,轴标签统称为索引。调用pd.Series即可创建Series s=pd.Series(data, index=index)

>>>s = pd.Series(np.random.randn(5), index=["a", "b", "c", "d", "e"])
>>>s
a    0.560815
b   -0.623777
c    0.864192
d    0.045251
e   -2.292481
dtype: float64

>>>s1 = pd.Series([1, 2, 3, 4, 5], index=["a", "b", "c", "d", "e"])
>>>s1
a    1
b    2
c    3
d    4
e    5
dtype: int64

# Series可以用字典实例化
>>>s2 = pd.Series({"b": 1, "a": 0, "c": 2})
>>>s2
b    1
a    0
c    2
dtype: int64

Dataframe是由多种类型的列构成的二维标签数据结构,类似于excel、SQL表、或series对象构成的字典

>>>d = { "one": pd.Series([1.0, 2.0, 3.0], index=["a", "b", "c"]),
 "two": pd.Series([1.0, 2.0, 3.0, 4.0], index=["a", "b", "c", "d"]),
    }
>>>df = pd.DataFrame(d)
df

在这里插入图片描述

1.4.2 查看DataFrame数据的每列的名称
>>>df.columns
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
       'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
      dtype='object')
1.4.3查看"Cabin"这列的所有值
#法一
>>>df.Cabin
#法二
>>>df['Cabin']
0              NaN
1              C85
2              NaN
3             C123
       ....
888            NaN
889           C148
890            NaN
Name: Cabin, Length: 891, dtype: object
>>>type(df.Cabin)
pandas.core.series.Series
# 使用嵌套将其还原为dataframe
df[['Cabin']]
1.4.4 删除某一列

经过我们的观察发现一个测试集test_1.csv有一列a是多余的,我们需要将这个多余的列删去

#使用del命令
del test_1['a']
test_1.head()

#使用pop命令
test_1.pop('a')
test_1.head()

【思考】还有其他的删除多余的列的方式吗?

test_1 = pd.read_csv('test_1.csv')
test_1.drop(['a'],axis = 1)
这里返回的是一个副本,用inplace参数来删除test_1本身中的列a,默认为副本false
test_1.drop(['a'],axis = 1,inplace = True)
将某几列隐藏
这里的意思是将列元素隐藏,所以只显示其副本即可
test_1.drop(['PassengerId','Name','Age','Ticket'],axis = 1)

对比上述两种 如果想要完全的删除你的数据结构,使用inplace=True,因为使用inplace就将原数据覆盖了

1.5 筛选数据

1.5.1 以"Age"为筛选条件,显示年龄在10岁以下的乘客信息。
test_1[test_1['Age'] < 10]
1.5.2 筛选10岁以上和50岁以下
>>>midage = test_1[(test_1['Age'] > 10) & (test_1['Age'] < 50)]
>>>midage
>>>midage.shape
(576,14)
1.5.3 将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来
midage.to_csv('midage.csv')
midage.loc[[100],['Pclass','Sex','Name']]
#需要注意的是原数据中行数和索引对应的序号数不一样

在这里插入图片描述

midage1 = midage.reset_index(drop = True)
midage1.to_csv('midage1.csv')
midage1.loc[[100],['Pclass','Sex','Name']]

在这里插入图片描述

>>>midage.index
Int64Index([  0,   1,   2,   3,   4,   8,   9,  12,  13,  14,
            ...
            880, 881, 882, 883, 884, 885, 886, 887, 889, 890],
           dtype='int64', length=576)
           
>>>midage1.index
RangeIndex(start=0, stop=576, step=1)

【提示】在抽取数据中,我们希望数据的相对顺序保持不变,用什么函数可以达到这个效果呢?

  • reset_index 从官方文档中贴图显示其区别
    在这里插入图片描述
1.5.4 使用loc和iloc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来

loc需要写出具体的列名,而iloc通过第几列来确定

midage1.loc[[100,105,108],['Pclass','Name','Sex']]
midage1.iloc[[100,105,108],[3,4,5]]

在这里插入图片描述

第三节 探索性数据分析

1.6.1 利用Pandas对示例数据进行排序,要求升序
sample = pd.DataFrame(np.random.rand(3,3),index=list('213'),
             columns=list('bca'))
sample

在这里插入图片描述

sample.sort_values('a')

在这里插入图片描述

  • axis 默认为 0 按行排列;columns 1 按列排列
  • ascending 默认true升序排列;false 降序排列
# 按行索引升序排列,变成1 2 3
sample.sort_index()
# 按列索引升序排列,变成a b c
sample.sort_index(axis = 1)
# 按列索引降序排列
sample.sort_index(axis = 1,ascending = False)
# 任选两列同时降序排序
sample.sort_values(['a','c'], ascending = False)
1.6.2 利用Pandas对示例数据进行排序,要求升序
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

在这里插入图片描述
【提醒】两个DataFrame相加后,会返回一个新的DataFrame,对应的行和列的值会相加,没有对应的会变成空值NaN。

1.6.3 通过泰坦尼克号数据如何计算出在船上最大的家族有多少人?
df.head(2)
max(df['堂兄弟/妹个数'] + df['父母与小孩个数'])
1.6.4 学会使用Pandas describe()函数查看数据基本统计信息
df.describe()

在这里插入图片描述

>>>df['票价'].describe()
count    891.000000
mean      32.204208
std       49.693429
min        0.000000
25%        7.910400
50%       14.454200
75%       31.000000
max      512.329200
Name: 票价, dtype: float64
>>>from matplotlib import pyplot as plt
>>>plt.hist(df['票价'])   #画出直方图

在这里插入图片描述
从上面数据我们可以看出, 一共有891个票价数据,整体呈左偏分布
平均值约为:32.20, 标准差约为49.69,说明票价波动特别大, 25%的人的票价是低于7.91的,50%的人的票价低于14.45,75%的人的票价低于31.00, 票价最大值约为512.33,最小值为0

其他描述统计命令
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值