导入文件
首先是导入此次需要用到的两个包
import numpy as np
import pandas as pd
导入之前需要下载包
!pip install numpy
!pip install pandas
下载的很顺利,不顺利的可以考虑换个源,在代码后面补上-i 和 源的地址。
接着是文件的读取,本次读取的文件格式是csv,所以用pandas库中的read_csv()函数来读取
df = pd.read_csv('train.csv')
上面的train.csv文件是与代码文件在同一父文件夹下的,可以直接用该相对路径来找到对应文件,如果需要读取的文件通过相对路径来索引太复杂,可以通过绝对路径来读取,下面是在我的电脑中读取文件的绝对路径:
df = pd.read_csv('D:/Young Cat/DataWhale/hands-on-data-analysis-master/第一单元项目集合/train.csv')
通过read_csv()函数,将文件里的内容读取到变量df之中
可以看到该文件中有891个乘客信息,每行有12个该乘客的个人相关信息
但是生活中并不是所有的数据都是这么小的,如果是对于以亿为单位的行数的话,一次性处理这么多的数据对个人的电脑来说是有点不现实的,所以我们可以将文件分成几分来读取,例如将每100行分为一个数据模块,进行逐块读取,那么代码就是这样的:
chunker = pd.read_csv('train.csv', chunksize=100)
通过输出chunker的类型,可以知道这样分块读取得到的数据类型是’pandas.io.parsers.TextFileReader’
>>>print(type(chunker))
<class 'pandas.io.parsers.TextFileReader'>
该类型是可迭代的,可以通过for循环进行输出
for i in chunker:
print(i)
输出的结果是类似于第一次输出的结果的,只不过不是一次性将891行输出,而是先将0-99行输出,再对100-199行进行输出,以此类推。(vscode 展示效果不太好)这样子看上去分块读取有点多此一举,但是对于庞大的数据来说,对数据进行筛选以及清洗时,会有很大的帮助。
观察数据
df.head() //默认展示前5行,括号内输入相应的数字即显示对应的行数量
df.tail() //默认展示后5行,括号内输入相应的数字即显示对应的行数量
df.info() //观察数据的总体信息
数据操作
经过上面导入文件可以看到,泰坦尼克号乘客信息的CSV文件像是Excel文件,有很多行很多列,如果对这些数据进行一些操作的话,一般用Pandas库里的Dataframe读取数据。
Series 和 Dataframe
- Series:我个人理解为类似numpy里边的一维array,是一个一维数组对象,但是有索引。
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
example_1 = pd.Series(sdata)
example_1
#输出结果
Ohio 35000
Texas 71000
Oregon 16000
Utah 5000
dtype: int64
如果不自己设置索引,Series也会自动从0设置索引
sdata = [35000, 71000, 16000, 5000]
example_1 = pd.Series(sdata)
example_1
#输出结果
0 35000
1 71000
2 16000
3 5000
dtype: int64
- DataFrame:多维数组,行有索引,列有列名。
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)
example_2
#输出结果
state year pop
0 Ohio 2000 1.5
1 Ohio 2001 1.7
2 Ohio 2002 3.6
3 Nevada 2001 2.4
4 Nevada 2002 2.9
5 Nevada 2003 3.2
查看DataFrame数据的每列的名称
df.columns
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp','Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],dtype='object')
查看指定列的方法
#查看所有的乘客的名字
#方法一
df["Name"]
#方法二
df.Name
两种方法都可以得到所有乘客的名字
删除指定列
drop
DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplace=False)
参数含义:
- label:要删除的行和列,以列表形式给出
- axis:默认值为0,指需要删除的是列,删除列时需传入0
- index:直接指定要删除的行,删除多行可以使用列表作为参数
- columns:直接指定要删除的列,删除多行可以使用列表作为参数
- inplace:默认值为False,指不在原数据上进行操作;如果为True,则在原数据操作
用drop删除列(行)的两种方式:
- 通过参数label和axis指定
- 通过参数columns(index)指定
#初始数据
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)
example_2
#运行结果
state year pop
0 Ohio 2000 1.5
1 Ohio 2001 1.7
2 Ohio 2002 3.6
3 Nevada 2001 2.4
4 Nevada 2002 2.9
5 Nevada 2003 3.2
通过参数label和axis指定
#列
a = example_2.drop(labels=['year'],axis=1)
a
#运行结果
state pop
0 Ohio 1.5
1 Ohio 1.7
2 Ohio 3.6
3 Nevada 2.4
4 Nevada 2.9
5 Nevada 3.2
#行
b = example_2.drop(labels=[1,2],axis=0)
b
#运行结果
state year pop
0 Ohio 2000 1.5
3 Nevada 2001 2.4
4 Nevada 2002 2.9
5 Nevada 2003 3.2
接下来是通过参数columns(index)指定
#列
a = example_2.drop(columns=['pop'])
a
#运行结果
state year
0 Ohio 2000
1 Ohio 2001
2 Ohio 2002
3 Nevada 2001
4 Nevada 2002
5 Nevada 2003
#行
b = example_2.drop(index=[3,5])
b
#运行结果
state year pop
0 Ohio 2000 1.5
1 Ohio 2001 1.7
2 Ohio 2002 3.6
4 Nevada 2002 2.9
ok啦!这些就是drop简单的用法啦!因为drop可以选择不在原数据上进行操作,所以我们可以通过drop实现对指定列的隐藏,以此来观测需要重点观测的数据
除了drop方法,下面还有del方法。
del
相对于drop,del方法一次性只能删除一列,比较不方便。正是drop可以同时删除多列,所以传入的几个参数的数据类型都是列表
- 用法
del example_2['state']
example_2
#运行结果
year pop
0 2000 1.5
1 2001 1.7
2 2002 3.6
3 2001 2.4
4 2002 2.9
5 2003 3.2
筛选数据
通常我们需要从数据里挑选出符合一定条件的来观测,例如我们需要从这些乘客里查看年龄小于10岁的人有哪些,我首先想到的处理方式是这样的:
df["Age"]<10
然而很遗憾,python再强大再好用也不能理解我的意思,这样子表达并不会返回我想要的结果,而且会报错!但这样子做并不是无意义的,先来看看这返回的是什么:
print(df["Age"]<10)
可以看到这里返回了891个bool类型的数据,不清楚整体是不是一个列表,但我认为应该是列表,把这些列表传入原数据中,为True的行则显示,为False的行则不显示:
df[df["Age"]<10]
可以看到,这里的满足指定条件的数据都显示出来了
如果有多个判定条件,只需要通过与或运算操作即可(但是列表和元组好像不能进行与或操作…所以传入的可能就不是列表了…但是道理大家懂就好了嘿嘿)
midage = df[(df["Age"]>10)& (df["Age"]<50)]
midage
因为我们提取的是原数据里的一部分数据,前面的行索引并不是完整的,例如上图,总共有576行,但是最后一行的索引是890,显然正常的数据最后的行索引应该是575(从0开始),为了避免后续操作引起不必要的麻烦,我们可以将这部分数据重新建立属于它们自己的索引。
midage = midage.reset_index(drop=True)
midage
通过reset_index()
可以还原索引,变为默认的整型索引,如果原索引是乘客的名字,则也会转变为默认的整型索引。drop=True
的作用把原来的索引丢弃或者转化为对应列。