数据分析实例——DataWhale202207(kaggle泰坦尼克任务)

DataWhale课程地址:datawhalechina/hands-on-data-analysis: 动手学数据分析以项目为主线,知识点孕育其中,通过边学、边做、边引导来得到更好的学习效果 (github.com)

写在前面:DataWhale使用jupyter形式,笔者使用Pycharm使用的代码形式。

数据集下载地址:Titanic - Machine Learning from Disaster | Kaggle

目录

DataWhale课程地址:datawhalechina/hands-on-data-analysis: 动手学数据分析以项目为主线,知识点孕育其中,通过边学、边做、边引导来得到更好的学习效果 (github.com)

写在前面:DataWhale使用jupyter形式,笔者使用Pycharm使用的代码形式。

目录

1.数据加载

1.1数据载入及初步观察

任务一:导入numpy和pandas

任务二:载入数据

任务三:每1000行为一个数据模块,逐块读取

任务四:将表头改成中文,索引改为乘客ID [对于某些英文资料,我们可以通过翻译来更直观的熟悉我们的数据]

任务五:查看数据的基本信息,观察表格前10行的数据和后15行的数据

 任务六:判断数据是否为空,为空的地方返回True,其余地方返回False

任务七:将加载并做出改变的数据,在工作目录下保存为一个新文件train_chinese.csv 

1.2Pandas基础

 任务一:pandas中有两个数据类型DateFrame和Series,通过查找简单了解他们。

任务二:载入"train.csv"文件并进行一些操作

任务三:筛选的逻辑

1.3探索性数据分析

任务一:利用Pandas对示例数据进行排序,要求升序

 任务二:对泰坦尼克号数据(trian.csv)按票价和年龄两列进行综合排序

任务三:利用Pandas进行算术计算,计算两个DataFrame数据相加结果

任务四:通过泰坦尼克号数据如何计算出在船上最大的家族有多少人

 任务五:使用Pandas describe()函数查看数据基本统计信息 

2.数据清洗及特征处理

2.1 缺失值观察与处理

任务一:缺失值观察

任务二:对缺失值进行处理

2.2 重复值观察与处理

任务一:请查看数据中的重复值

判断重复值-duplicated()

任务二:对重复值进行处理

删除重复值-drop_duplicates()

2.3 特征观察与处理

任务一:对年龄进行分箱(离散化)处理

¶​​​​​​参考链接

pd.cut()

任务二:对文本变量进行转换

Pandas.get_dummies Pandas 中的 get_dummies 方法主要用于对类别型特征做 One-Hot 编码(独热编码)。

任务三:从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等)

2.4 数据的合并

任务一:将data文件夹里面的所有数据都载入,与之前的原始数据相比,观察他们的之间的关系

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

任务三:使用concat方法:将train-left-down和train-right-down横向合并为一张表,并保存这张表为result_down。

pd.concat()函数简介

任务四:使用DataFrame自带的方法join方法和append:完成任务二和任务三的任务

使用Panads的merge方法和DataFrame的append方法:完成任务二和任务三的任务

2.5 换一种角度看数据

2.6 数据运用


1.数据加载

1.1数据载入及初步观察

任务一:导入numpy和pandas

#导入numpy和pandas
import numpy as np
import pandas as pd

安装numpy和pandas:  pip install numpy pandas

 

任务二:载入数据

#载入数据
df = pd.read_csv('train.csv')#已将文件放在工程目录下
#df = pd.read_csv('../train.csv')#绝对路径格式
print(df.head(3))#输出数据的前三行以判断数据是否成功导入

思考:read_csv与read_table 的区别

在这里插入图片描述

 read_csv和read_table都是是加载带分隔符的数据,每一个分隔符作为一个数据的标志,但二者读出来的数据格式还是不一样的:read_table是以制表符 \t 作为数据的标志,也就是以行为单位进行存储,每一字符串为一列而不是每一个字符串;read_csv每一字符串为一列

如果想让他们效果一样,需要怎么做?

# 调用read_table函数读取文件 data = pd.read_table("../data.txt,sep=','")

# 调用read_csv函数读取文件 df = pd.read_csv("../data.txt")


思考:TSV文件与CSV文件的区别与读取/生成

  • TSV与CSV的区别: 1)从名称上即可知道,TSV是用制表符(Tab,'\t')作为字段值的分隔符;CSV是用半角逗号(',')作为字段值的分隔符; 2)IANA规定的标准TSV格式,字段值之中是不允许出现制表符的。
  • Python对TSV文件的支持: Python的csv模块准确的讲应该叫做dsv模块,因为它实际上是支持范式的分隔符分隔值文件(DSV,delimiter-separated values)的。 delimiter参数值默认为半角逗号,即默认将被处理文件视为CSV。 当delimiter='\t'时,被处理文件就是TSV。
  • 参考链接

  

任务三:每1000行为一个数据模块,逐块读取

#每1000行为一个数据模块,逐块读取
data = pd.read_csv('train.csv', chunksize=1000)
#print(data)
#直接输出data时会出现
for chunk in data:#可以通过逐 block 加载
    print(chunk.astype(str))

 对于的解决参考此链接:通过逐 block 加载

【思考】什么是逐块读取?为什么要逐块读取呢?chunker(数据块)是什么类型?用for循环打印出来出处具体的样子是什么?

每次读取文件的最多chunksize行,每次读取到的部分以DataFrame类型返回。

逐块读取可以用来读取大文件,防止将文件一次性读入,因为内存占用过多产生各种问题。

链接:DataFrame类型解析

 

任务四:将表头改成中文,索引改为乘客ID [对于某些英文资料,我们可以通过翻译来更直观的熟悉我们的数据]

#将表头改成中文,索引改为乘客ID 

#法1
df = pd.read_csv('train.csv', names=['乘客ID','是否幸存','仓位等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数','船票信息','票价','客舱','登船港口'],index_col='乘客ID',header=0)
# pd.set_option('display.max_columns', None)   #显示完整的列
# pd.set_option('display.max_rows', None) 	 #显示完整的行
print(df.head())#默认为5行

#法2
newNamesDict={
    'PassengerId':'乘客ID',
    'Survived':'是否幸存',
    'Pclass':'乘客等级(1/2/3等舱位)',
    'Name':'乘客姓名',
    'Sex':'性别',
    'Age':'年龄',
    'SibSp':'堂兄弟/妹个数',
    'Parch':'父母与小孩个数',
    'Ticket':'船票信息',
    'Fare':'票价',
    'Cabin':'客舱',
    'Embarked':'登船港口',
}
df=pd.read_csv('train.csv')
df=df.rename(columns=newNamesDict)
df=df.set_index(keys='乘客ID')#需要设置为索引的列名,可以是单个列名,或者是多个列名
print(df.head())

pd.read_csv()参数详解

set_index详解

pandas读取csv格式数据时header参数设置

任务五:查看数据的基本信息,观察表格前10行的数据和后15行的数据

#查看数据的基本信息
print(df.info())

#观察表格前10行的数据和后15行的数据
pd.set_option('display.max_columns', None)   #显示完整的列
pd.set_option('display.max_rows', None) 	 #显示完整的行
print(df.head(10),'\n',df.tail(15))

 任务六:判断数据是否为空,为空的地方返回True,其余地方返回False

#判断数据是否为空,为空的地方返回True,其余地方返回False
pd.set_option('display.max_columns', None)   #显示完整的列
pd.set_option('display.max_rows', None) 	 #显示完整的行
print(df.isnull().head())
pd.options.display.max_rows=15#最多显示15行
print(df.isnull().sum())

pandas中显示行、列个数的设置 

任务七:将加载并做出改变的数据,在工作目录下保存为一个新文件train_chinese.csv 

#将加载并做出改变的数据,在工作目录下保存为一个新文件train_chinese.csv
#注:不同的操作系统保存下来可能会有乱码,可以加入 encoding='GBK' 或 encoding = 'utf-8'
try:
    df.to_csv('train_chinese.csv',encoding = 'utf-8')
    print('保存成功')
except:
    print('保存失败')

1.2Pandas基础

 任务一:pandas中有两个数据类型DateFrame和Series,通过查找简单了解他们。

Series:一种类似于一维数组的对象,是由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据也可产生简单的Series对象。注意:Series中的索引值是可以重复的。
DataFrame:一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame即有行索引也有列索引,可以被看做是由Series组成的字典。

参考

#任务一:pandas中有两个数据类型DateFrame和Series,通过查找简单了解他们。

import numpy as np
import pandas as pd

sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
example_1 = pd.Series(sdata)
print(example_1)

data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
        'year': [2000, 2001, 2002, 2001, 2002, 2003],'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
example_2 = pd.DataFrame(data)
print(example_2)

数据分析实例——DataWhale202207(kaggle泰坦尼克任务)_第1张图片

数据分析实例——DataWhale202207(kaggle泰坦尼克任务)_第2张图片

 

任务二:载入"train.csv"文件并进行一些操作

import numpy as np
import pandas as pd

#任务二:根据上节课的方法载入"train.csv"文件
df = pd.read_csv('train.csv')

#任务三:查看DataFrame数据的每列的名称
print(df.columns)

#任务四:查看"Cabin"这列的所有值
print(df['Cabin'])
print(df.Cabin)

#任务五:加载文件"test_1.csv",然后对比"train.csv",看看有哪些多出的列,然后将多出的列删除
df1=pd.read_csv('test_1.csv')
print(df1.head(3))#输出观察
del df1['a']# 删除多出的'a'列
print(df1.head(3))#输出删除'a'列后的列表

#任务六: 将['PassengerId','Name','Age','Ticket']这几个列元素隐藏,只观察其他几个列元素
# df1.drop(['PassengerId','Name','Age','Ticket'],axis=1).head(3)
# print(df1)#只是隐藏,并未删除,因此此次输出的仍是隐藏前的完整列表
print(df1.drop(['PassengerId','Name','Age','Ticket'],axis=1).head(3))#此次输出隐藏操作后的列表

总结  

在 Pandas DataFrame 中

1.添加一行

 .loc [index]  将字典作为行添加 Dataframe .append 方法

2. 添加一列

df[column] = value df.insert pd.concat 

3.删除行、列

删除行

data.drop([0,1#行索引],inplace = True)

data.drop(index = [3,4,5#行索引],inplace = True)

删除列

data.drop('列名',axis = 1,inplace = True) 

data.drop(columns = [‘列名1','列名2'],inplace = True)

参数含义:

labels:要删除的行或列,用列表给出
axis:默认为0,指要删除的是行,删除列时需指定axis为1
index :直接指定要删除的行,删除多行可以使用列表作为参数
columns:直接指定要删除的列,删除多列可以使用列表作为参数
inplace: 默认为False,该删除操作不改变原数据;inplace = True时,改变原数据

任务三:筛选的逻辑

利用pandas进行条件筛选和组合筛选

 loc方法

pandas索引函数loc和iloc的区别 

import numpy as np
import pandas as pd
df = pd.read_csv('train.csv')
#任务一: 我们以"Age"为筛选条件,显示年龄在10岁以下的乘客信息
print(df[df["Age"]<10].head(3))
# 任务二: 以"Age"为条件,将年龄在10岁以上和50岁以下的乘客信息显示出来,并将这个数据命名为midage
midage = df[(df["Age"]>10)& (df["Age"]<50)]
print(midage.head(3))
# 任务三:将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来
midage = midage.reset_index(drop=True)
print(midage.loc[[100],['Pclass','Sex']])
#任务四:使用loc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
print(midage.loc[[100,105,108],['Pclass','Name','Sex']])
#任务五:使用iloc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
midage.iloc[[100,105,108],[2,3,4]]

1.3探索性数据分析

任务一:利用Pandas对示例数据进行排序,要求升序

frame = pd.DataFrame(np.arange(8).reshape((2, 4)),
                    index=['2', '1'],
                    columns=['d', 'a', 'b', 'c'])#自己构建一个都为数字的DataFrame数据
print(frame)
print(frame.sort_values(by='c', ascending=True))
#根据'c'列的值来升序排列(by参数指向要排列的列,ascending参数指向排序的方式(升序还是降序))

【代码解析】
pd.DataFrame() :创建一个DataFrame对象
np.arange(8).reshape((2, 4)) : 生成一个二维数组(2*4),第一列:0,1,2,3 第二列:4,5,6,7
index=['2, 1] :DataFrame 对象的索引列
columns=['d', 'a', 'b', 'c'] :DataFrame 对象的索引行

排序方式小总结

让行索引升

序排序

让列索引升

序排序

 让列索引降

序排序

让任选两列数据同时降序排序
frame.sort_index() frame.sort_index(axis=1)

frame.sort_index

(axis=1, ascending=False)

frame.sort_values(by=['a', 'c'], ascending=False)
数据分析实例——DataWhale202207(kaggle泰坦尼克任务)_第3张图片 数据分析实例——DataWhale202207(kaggle泰坦尼克任务)_第4张图片 数据分析实例——DataWhale202207(kaggle泰坦尼克任务)_第5张图片 数据分析实例——DataWhale202207(kaggle泰坦尼克任务)_第6张图片

 任务二:对泰坦尼克号数据(trian.csv)按票价和年龄两列进行综合排序

import numpy as np
import pandas as pd
text = pd.read_csv('train_chinese.csv')#导入之前保存的数据
text1=text.sort_values(by=['票价', '年龄'], ascending=False)
pd.set_option('display.max_columns', None)   #显示完整的列
pd.set_option('display.max_rows', None) 	 #显示完整的行
print(text1.head(20))#查看前二十行数据

 根据输出数据思考年龄及票价与存活与否的关系。

任务三:利用Pandas进行算术计算,计算两个DataFrame数据相加结果

# 具体请看《利用Python进行数据分析》第五章 算术运算与数据对齐 部分
#建立一个例子
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'])
print(frame1_a)
print(frame1_b)
print(frame1_a + frame1_b)
#两个DataFrame相加后,会返回一个新的DataFrame,对应的行和列的值会相加,没有对应的会变成空值NaN。

 数据分析实例——DataWhale202207(kaggle泰坦尼克任务)_第7张图片数据分析实例——DataWhale202207(kaggle泰坦尼克任务)_第8张图片数据分析实例——DataWhale202207(kaggle泰坦尼克任务)_第9张图片

任务四:通过泰坦尼克号数据如何计算出在船上最大的家族有多少人

#最大的家族有多少人(‘兄弟姐妹个数’+‘父母子女个数’)
import numpy as np
import pandas as pd
text = pd.read_csv('train_chinese.csv')#导入之前保存的数据
print(text['兄弟姐妹个数'] + text['父母子女个数'])
print(max(text['兄弟姐妹个数'] + text['父母子女个数']))
#两列相加返回一个DataFrame,然后用max函数求出最大值

 任务五:使用Pandas describe()函数查看数据基本统计信息 

调用describe()函数会自动计算如下数值:
count : 样本数据大小
mean : 样本数据的平均值
std : 样本数据的标准差
min : 样本数据的最小值
25% : 样本数据25%的时候的值
50% : 样本数据50%的时候的值
75% : 样本数据75%的时候的值
max : 样本数据的最大值

 对泰坦尼克的部分项目进行分析

print('票价的统计信息:\n',text['票价'].describe())
print('父母子女个数的统计信息:\n',text['父母子女个数'].describe())

 数据分析实例——DataWhale202207(kaggle泰坦尼克任务)_第10张图片数据分析实例——DataWhale202207(kaggle泰坦尼克任务)_第11张图片

 票价分析: 一共有891个票价数据, 平均值约为:32.20, 标准差约为49.69,说明票价波动特别大, 25%的人的票价是低于7.91的,50%的人的票价低于14.45,75%的人的票价低于31.00, 票价最大值约为512.33,最小值为0。

父母子女个数分析:一共有891个数据, 平均值约为:0.38, 标准差约为49.69,75%甚至更多的人没有父母子女,父母子女最多的是6,最少为0。

2.数据清洗及特征处理

       我们拿到的数据通常是不干净的,所谓的不干净,就是数据中有缺失值,有一些异常点等,需要经过一定的处理才能继续做后面的分析或建模,所以拿到数据的第一步是进行数据清洗,本章我们将学习缺失值、重复值、字符串和数据转换等操作,将数据清洗成可以分析或建模的样子。

2.1 缺失值观察与处理

#任务一:缺失值观察
#方法一
# df.info()
# #方法二
# df.isnull().sum()

#任务二:对缺失值进行处理
df[df['Age']==None]=0
df[df['Age'].isnull()] = 0 # 还好
df[df['Age'] == np.nan] = 0

print(df.dropna())
print(df.fillna(0))#以0替代缺失值

任务一:缺失值观察

查看每个特征缺失值个数

方法一   df.info()

方法二   df.isnull().sum()

 df.info() df.isnull().sum()
数据分析实例——DataWhale202207(kaggle泰坦尼克任务)_第12张图片 数据分析实例——DataWhale202207(kaggle泰坦尼克任务)_第13张图片

任务二:对缺失值进行处理

将缺失值变为0

方法一    df[df['Age']==None]=0

方法二    df[df['Age'].isnull()] = 0

方法三    df[df['Age'] == np.nan] = 0   #此处失败,原因不详

【思考】检索空缺值用np.nan,None以及.isnull()哪个更好,这是为什么?如果其中某个方式无法找到缺失值,原因又是为什么?

【回答】数值列读取数据后,空缺值的数据类型为float64所以用None一般索引不到,比较的时候最好用np.nan

 对有缺失值的行\列操作

df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

pandas.DataFrame.dropna — pandas 1.4.3 documentation (pydata.org)

axis    0为行 1为列,default 0,数据删除维度
how   {‘any’, ‘all’}, default ‘any’,any:删除带有nan的行;all:删除全为nan的行
thresh  int,保留至少 int 个非nan行
subset list,在特定列缺失值处理
inplace  bool,是否修改源文件

对缺失值操作

df.fillna(self, value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)

pandas.DataFrame.fillna — pandas 1.4.3 documentation (pydata.org)

 参考实例

value

scalar, dict, Series, or DataFrame

用于填充孔的值(例如 0),或者是指定要用于每个索引(对于序列)或列(对于数据帧)的值的 dict/Series/DataFrame。不在字典/序列/数据帧中的值将不会被填充。此值不能是列表。

method method{'backfill', 'bfill', 'pad', 'ffill', None}, default None
用于填充重新索引的系列垫/填充中的孔的方法:将上一个有效观测值向前传播到下一个有效回填/填充:使用下一个有效观测值来填充间隙。
axis axis{0 或 'index', 1 或 'columns'}
要沿其填充缺失值的轴。
inplace 如果为 True,请就地填写。注意:这将修改此对象上的任何其他视图(例如,DataFrame 中列的无复制切片)。
limit 如果指定了方法,则这是要向前/向后填充的连续 NaN 值的最大数量。换句话说,如果存在超过此数量的连续NaNs的缺口,则只会部分填补。如果未指定方法,则这是将填充 NaN 的整个轴上的最大条目数。如果不是“无”,则必须大于 0。
downcast 对要向下转换的内容的字典,或者字符串“推断”,它将尝试向下转换到适当的相等类型(例如,如果可能的话,float64到int64)。

2.2 重复值观察与处理

#2.2.1 任务一:请查看数据中的重复值
#df[df.duplicated()]
print(df.duplicated().sum())
#2.2.2 任务二:对重复值进行处理
df = df.drop_duplicates()
#df.head()
print(df.drop_duplicates)
#2.2.3 任务三:将前面清洗的数据保存为csv格式
df.to_csv('test_clear.csv')

任务一:请查看数据中的重复值

判断重复值-duplicated()

函数的功能是检查数据中是否有重复值,用于标记 Series 中的值、DataFrame 中的记录行是否重复,重复为 True,不重复为 False。

每行数据都是和它前面的记录相比较。

针对DataFrame类型数据:

pandas.DataFrame.duplicated(subset=None,keep='first')

或者针对Series的数据:

pandas.Series.duplicated(keep='first')

subset参数:

具体哪一列或哪几列。

keep参数:

  • first:将重复项标记True为第一次出现的除外
  • last:将重复项标记True为最后一次除外
  • False:将所有重复项标记为True

任务二:对重复值进行处理

删除重复值-drop_duplicates()

该函数的作用是删除数据中的重复值
subset:表示按照指定的一个或者多个列属性来删除重复值,可选性;默认是全部列属性
keep:表示删除重复值后保留的数据,默认是保留第一条数据
inplace:表示删除重复是生成副本,还是直接在原数据上进行修改。这个参数的功能在pandas的功能都是如此
ingoore_index:生成数据的索引是元数据的,还是从0,1,2...到n-1的自然数排列

原文

2.3 特征观察与处理

我们对特征进行一下观察,可以把特征大概分为两大类:
数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare,其中Survived, Pclass为离散型数值特征,Age,SibSp, Parch, Fare为连续型数值特征
文本型特征:Name, Sex, Cabin,Embarked, Ticket,其中Sex, Cabin, Embarked, Ticket为类别型文本特征。

数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析。

Python实现连续数据的离散化处理主要基于两个函数:pandas.cut和pandas.qcut,pandas.cut根据指定分界点对连续数据进行分箱处理,pandas.qcut可以指定箱子的数量对连续数据进行等宽分箱处理(注意:所谓等宽指的是每个箱子中的数据量是相同的)

【参考】pandas.cut — pandas 1.4.3 documentation (pydata.org)
【参考】pandas.qcut — pandas 1.4.3 documentation (pydata.org)

任务一:对年龄进行分箱(离散化)处理

¶​​​​​​
参考链接

#将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
df['AgeBand'] = pd.cut(df['Age'], 5,labels = [1,2,3,4,5])
df.head()
df.to_csv('test_ave.csv')


#将连续变量Age划分为(0,5] (5,15] (15,30] (30,50] (50,80]五个年龄段,并分别用类别变量12345表示
df['AgeBand'] = pd.cut(df['Age'],[0,5,15,30,50,80],labels = [1,2,3,4,5])
df.head(3)
df.to_csv('test_cut.csv')


#将连续变量Age按10% 30% 50 70% 90%五个年龄段,并用分类变量12345表示
df['AgeBand'] = pd.qcut(df['Age'],[0,0.1,0.3,0.5,0.7,0.9],labels = [1,2,3,4,5])
df.head()
df.to_csv('test_pr.csv')

pd.cut()

pd.cut( x, bins, right=True, labels=None, retbins=False,

precision=3,include_lowest=False, duplicates='raise')

x : 一维数组(对应前边例子中提到的销售业绩)

bins :整数,标量序列或者间隔索引,是进行分组的依据,

  • 如果填入整数n,则表示将x中的数值分成等宽的n份(即每一组内的最大值与最小值之差约相等);
  • 如果是标量序列,序列中的数值表示用来分档的分界值
  • 如果是间隔索引,“ bins”的间隔索引必须不重叠

right :布尔值,默认为True表示包含最右侧的数值

  • 当“ right = True”(默认值)时,则“ bins”=[1、2、3、4]表示(1,2],(2,3],(3,4]
  • bins是一个间隔索引时,该参数被忽略。

labels : 数组或布尔值,可选.指定分箱的标签

  • 如果是数组,长度要与分箱个数一致,比如“ bins”=[1、2、3、4]表示(1,2],(2,3],(3,4]一共3个区间,则labels的长度也就是标签的个数也要是3
  • 如果为False,则仅返回分箱的整数指示符,即x中的数据在第几个箱子里
  • 当bins是间隔索引时,将忽略此参数

retbins: 是否显示分箱的分界值。默认为False,当bins取整数时可以设置retbins=True以显示分界值,得到划分后的区间

precision:整数,默认3,存储和显示分箱标签的精度。

include_lowest:布尔值,表示区间的左边是开还是闭,默认为false,也就是不包含区间左边。

duplicates:如果分箱临界值不唯一,则引发ValueError或丢弃非唯一

任务二:对文本变量进行转换

#查看类别文本变量名及种类

#方法一: value_counts
df['Sex'].value_counts()

df['Cabin'].value_counts()

df['Embarked'].value_counts()

#方法二: unique
df['Sex'].unique()

df['Sex'].nunique()


#将类别文本转换为12345

#方法一: replace
df['Sex_num'] = df['Sex'].replace(['male','female'],[1,2])
df.head()

#方法二: map
df['Sex_num'] = df['Sex'].map({'male': 1, 'female': 2})
df.head()

#方法三: 使用sklearn.preprocessing的LabelEncoder
from sklearn.preprocessing import LabelEncoder
for feat in ['Cabin', 'Ticket']:
    lbl = LabelEncoder()
    label_dict = dict(zip(df[feat].unique(), range(df[feat].nunique())))
    df[feat + "_labelEncode"] = df[feat].map(label_dict)
    df[feat + "_labelEncode"] = lbl.fit_transform(df[feat].astype(str))

df.head()


# 将类别文本转换为one-hot编码

# 方法一: OneHotEncoder
for feat in ["Age", "Embarked"]:
    #     x = pd.get_dummies(df["Age"] // 6)
    #     x = pd.get_dummies(pd.cut(df['Age'],5))
    x = pd.get_dummies(df[feat], prefix=feat)
    df = pd.concat([df, x], axis=1)
    # df[feat] = pd.get_dummies(df[feat], prefix=feat)

df.head()

Pandas.get_dummies 
Pandas 中的 get_dummies 方法主要用于对类别型特征做 One-Hot 编码(独热编码)。

pandas.get_dummies(data, prefix=None, prefix_sep=’_’, dummy_na=False, columns=None,sparse=False, drop_first=False, dtype=None)

参数说明:

data : array-like, Series, or DataFrame 输入的数据

prefix : string, list of strings, or dict of strings, default None。get_dummies转换后,列名的前缀

columns : list-like, default None。指定需要实现类别转换的列名

dummy_na : bool, default False,增加一列表示空缺值,如果False就忽略空缺值

drop_first : bool, default False,获得k中的k-1个类别值,去除第一个。

参考链接


​​​​​​​任务三:从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等)

df['Title'] = df.Name.str.extract('([A-Za-z]+)\.', expand=False)
df.head()

讲解链接

2.4 数据的合并

任务一:将data文件夹里面的所有数据都载入,与之前的原始数据相比,观察他们的之间的关系

#导入data中的四个文件
text_left_up = pd.read_csv("data/train-left-up.csv")
text_left_down = pd.read_csv("data/train-left-down.csv")
text_right_up = pd.read_csv("data/train-right-up.csv")
text_right_down = pd.read_csv("data/train-right-down.csv")
#输出四个文件观察它们的关系
print(text_left_up)
print(text_left_down)
print(text_right_up)
print(text_right_down)

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

任务三:使用concat方法:将train-left-down和train-right-down横向合并为一张表,并保存这张表为result_down。

#任务二:使用concat方法:将数据train-left-up.csv和train-right-up.csv横向合并为一张表,并保存这张表为result_up
#任务三:使用concat方法:将train-left-down和train-right-down横向合并为一张表,并保存这张表为result_down。
# 然后将上边的result_up和result_down纵向合并为result。
list_up = [text_left_up,text_right_up]
result_up = pd.concat(list_up,axis=1)
result_up.to_csv('result_up.csv')

list_down=[text_left_down,text_right_down]
result_down = pd.concat(list_down,axis=1)
result_down.to_csv('result_down.csv')

result = pd.concat([result_up,result_down])
result.to_csv('result.csv')

pd.concat()函数简介

pd.concat()函数可以沿着指定的轴将多个dataframe或者series拼接到一起,这一点和另一个常用的pd.merge()函数不同,pd.merge()函数只能实现两个表的拼接。

pd.concat()函数:

pd.concat( objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=None, copy=True,)

原文链接

任务四:使用DataFrame自带的方法join方法和append:完成任务二和任务三的任务

使用Panads的merge方法和DataFrame的append方法:完成任务二和任务三的任务

(即将弃用)

resul_up = text_left_up.join(text_right_up)
result_down = text_left_down.join(text_right_down)
result = result_up.append(result_down)
result.head()

result_up = pd.merge(text_left_up,text_right_up,left_index=True,right_index=True)
result_down = pd.merge(text_left_down,text_right_down,left_index=True,right_index=True)
result = resul_up.append(result_down)
result.head()

result.to_csv('result.csv')
.append() dataframe数据类型的方法,提供了行方向的拼接操作
.join()

dataframe数据类型的方法,提供了列方向的拼接操作,支持左联、右联、内联和外联四种操作类型

.merge() pandas的顶级方法,提供了类似于SQL数据库连接操作的功能,支持左联、右联、内联和外联等全部四种SQL连接操作类型

Pandas中的拼接操作(concat,append,join,merge)

2.5 换一种角度看数据

将我们的数据变为Series类型的数据

stack函数:将特征名称转化为变量,也就是将数据集由横向改为纵向,或者为转秩。

# 将完整的数据加载出来
text = pd.read_csv('result.csv')
text.head()
unit_result=text.stack().head(20)
print(unit_result.head())

#将代码保存为unit_result,csv
unit_result.to_csv('unit_result.csv')

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

数据分析实例——DataWhale202207(kaggle泰坦尼克任务)_第14张图片

2.6 数据运用

你可能感兴趣的