数据集下载地址: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 数据运用
#导入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行为一个数据模块,逐块读取
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
#法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参数设置
#查看数据的基本信息
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
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
#注:不同的操作系统保存下来可能会有乱码,可以加入 encoding='GBK' 或 encoding = 'utf-8'
try:
df.to_csv('train_chinese.csv',encoding = 'utf-8')
print('保存成功')
except:
print('保存失败')
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)
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]]
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)
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))#查看前二十行数据
根据输出数据思考年龄及票价与存活与否的关系。
# 具体请看《利用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。
#最大的家族有多少人(‘兄弟姐妹个数’+‘父母子女个数’)
import numpy as np
import pandas as pd
text = pd.read_csv('train_chinese.csv')#导入之前保存的数据
print(text['兄弟姐妹个数'] + text['父母子女个数'])
print(max(text['兄弟姐妹个数'] + text['父母子女个数']))
#两列相加返回一个DataFrame,然后用max函数求出最大值
调用describe()函数会自动计算如下数值:
count : 样本数据大小
mean : 样本数据的平均值
std : 样本数据的标准差
min : 样本数据的最小值
25% : 样本数据25%的时候的值
50% : 样本数据50%的时候的值
75% : 样本数据75%的时候的值
max : 样本数据的最大值
对泰坦尼克的部分项目进行分析
print('票价的统计信息:\n',text['票价'].describe())
print('父母子女个数的统计信息:\n',text['父母子女个数'].describe())
票价分析: 一共有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。
我们拿到的数据通常是不干净的,所谓的不干净,就是数据中有缺失值,有一些异常点等,需要经过一定的处理才能继续做后面的分析或建模,所以拿到数据的第一步是进行数据清洗,本章我们将学习缺失值、重复值、字符串和数据转换等操作,将数据清洗成可以分析或建模的样子。
#任务一:缺失值观察
#方法一
# 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()
将缺失值变为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.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的自然数排列原文
我们对特征进行一下观察,可以把特征大概分为两大类:
数值型特征: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个类别值,去除第一个。
参考链接
df['Title'] = df.Name.str.extract('([A-Za-z]+)\.', expand=False)
df.head()
讲解链接
#导入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。
# 然后将上边的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,)
原文链接
(即将弃用)
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)
将我们的数据变为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())