数据集下载 Titanic - Machine Learning from Disaster | Kaggle
import numpy as np
import pandas as pd
pd.read_csv('train.csv')
import os
path = os.path.abspath('train.csv')
pd.read_csv(path)
【提示】相对路径载入报错时,尝试使用os.getcwd()查看当前工作目录。
【思考】知道数据加载的方法后,试试pd.read_csv()和pd.read_table()的不同,如果想让他们效果一样,需要怎么做?了解一下'.tsv'和'.csv'的不同,如何加载这两个数据集?
注意:read_csv和read_table都是是加载带分隔符的数据,每一个分隔符作为一个数据的标志,
但是read_csv是以‘,’为标志,而read_table是以制表符 \t 作为数据的标志,也就是以行为单位进
行存储。
pd.read_table(path)
所以把read_table的分隔符改为‘,’就可以变得和read_csv一样了
pd.read_table(path,sep = ',')
【总结】加载的数据是所有工作的第一步,我们的工作会接触到不同的数据格式
(eg:.csv;.tsv;.xlsx),但是加载的方法和思路都是一样的,在以后工作和做项目的过程中,遇到之
前没有碰到的问题,要多多查资料吗,使用googel,了解业务逻辑,明白输入和输出是什么。
df = pd.read_csv(path,chunksize = 1000)
df.get_chunk()
方法二:用for循环
df = pd.read_csv(path,chunksize = 1000)
for chunker in df:
print(chunker)
这里因为是print打印出来的,所以看起来很丑(只能4列4列地打印)
【思考】什么是逐块读取?为什么要逐块读取呢?
逐块读取就是将文本分成若干块。因为我们平时使用pandas来处理文件的时候,经常会遇到大文
件,但有时候我们只想要读取其中的一部分数据或对文件进行逐块处理。
【提示】大家可以chunker(数据块)是什么类型?用for
循环打印出来出处具体的样子是什么?
chunker(数据块)的类型:TextFileReader
用for
循环打印出来的样子是:
0x19569050a00>
PassengerId => 乘客ID
Survived => 是否幸存
Pclass => 乘客等级(1/2/3等舱位)
Name => 乘客姓名
Sex => 性别
Age => 年龄
SibSp => 堂兄弟/妹个数
Parch => 父母与小孩个数
Ticket => 船票信息
Fare => 票价
Cabin => 客舱
Embarked => 登船港口
df = pd.read_csv('train.csv')
df.columns = ['乘客ID','是否幸存','乘客等级(1/2/3等舱位)','乘客姓名','性别','年龄',
'堂兄弟/妹个数','父母与小孩个数','船票信息','票价','客舱','登船港口']
df
df = pd.read_csv('train.csv')
df.rename(columns = {'PassengerId':'乘客ID','Survived':'是否幸存',
'Pclass':'乘客等级(1/2/3等舱位)','Name':'乘客姓名',
'Sex':'性别','Age':'年龄','SibSp':'堂兄弟/妹个数',
'Parch':'父母与小孩个数','Ticket':'船票信息','Fare':'票价',
'Cabin':'客舱','Embarked':'登船港口'},inplace=True)
df
导入数据后,你可能要对数据的整体结构和样例进行概览,比如说,数据大小、有多少列,各列都
是什么格式的,是否包含null等
df.info(): # 打印摘要
df.describe(): # 描述性统计信息
df.values: # 数据
df.to_numpy() # 数据 (推荐)
df.shape: # 形状 (行数, 列数)
df.columns: # 列标签
df.columns.values: # 列标签
df.index: # 行标签
df.index.values: # 行标签
df.head(n): # 前n行
df.tail(n): # 尾n行
pd.options.display.max_columns=n: # 最多显示n列
pd.options.display.max_rows=n: # 最多显示n行
df.memory_usage(): # 占用内存(字节B)
内容很多,不求一下子全记住,但是要知道有这么一回事,熟能生巧,以后用多了就记住了
df.head(10)
df.tail(15)
df.isnull()
【总结】上面的操作都是数据分析中对于数据本身的观察
【思考】对于一个数据,还可以从哪些方面来观察?找找答案,这个将对下面的数据分析有很大的帮助
df.info(): # 打印摘要
df.describe(): # 描述性统计信息
df.values: # 数据
df.to_numpy() # 数据 (推荐)
df.shape: # 形状 (行数, 列数)
df.columns: # 列标签
df.columns.values: # 列标签
df.index: # 行标签
df.index.values: # 行标签
df.head(n): # 前n行
df.tail(n): # 尾n行
pd.options.display.max_columns=n: # 最多显示n列
pd.options.display.max_rows=n: # 最多显示n行
df.memory_usage(): # 占用内存(字节B)
df.to_csv('train_chinese.csv')
【总结】数据的加载以及入门,接下来就要接触数据本身的运算,我们将主要掌握numpy和
pandas在工作和项目场景的运用。
我们学习pandas的基础操作,那么上一节通过pandas加载之后的数据,其数据类型是什么呢?
pandas中有两个数据类型Dateframe和Series
Series:一种类似于一维数组的对象,是由一组数据(各种NumPy数据类型)以及一组与之相关的数
据标签(即索引)组成。仅由一组数据也可产生简单的Series对象。注意:Series中的索引值是可以
重复的。
DataFrame:一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字
符串、布尔型等),DataFrame即有行索引也有列索引,可以被看做是由Series组成的字典。
import numpy as np
import pandas as pd
s = pd.Series([1, 2, 3, 4, 5])
s
s = {'A': [1, 2, 3, 4, 5],'B': [6, 7, 8, 9, 10]}
s1 = pd.DataFrame(s)
s1
df = pd.read_csv('train.csv')
df
df.columns
#方法一
df.Cabin
#方法二
df['Cabin']
上述两种方法的输出类型皆是Series,若想转成DateFrame类型则用下面这种方法
df[['Cabin']]
df = pd.read_csv('test_1.csv')
df
经过我们的观察发现一个测试集test_1.csv有两列是多余的,我们需要将这个多余的列删去
del df['Unnamed: 0']
del df['a']
df
方法一:使用pop()函数
df = pd.read_csv('test_1.csv')
df.pop('a')
注意:pop()函数的返回值是被删除的元素
使用要返回删除a列后的数据,要重新调用df
df = pd.read_csv('test_1.csv')
df.pop('a')
df.pop('Unnamed: 0')
df
详情见Drop函数的用法
注意:这里有时候报错可能是上面已经把a列删除了,所以这里要重新加载文件
df = pd.read_csv('test_1.csv')
df.drop(['a','Unnamed: 0'],axis = 1)
注意:这里返回的只是一个副本,原本的df的a列并没有被删除
df = pd.read_csv('test_1.csv')
df.drop(['a','Unnamed: 0'],axis = 1)
df
所以想要df中的a列被删除,还要加上inplace = True
df = pd.read_csv('test_1.csv')
df.drop(['a','Unnamed: 0'],axis = 1,inplace = True)
df
df.drop(['a'],axis = 1)
表格数据中,最重要的一个功能就是要具有可筛选的能力,选出我所需要的信息,丢弃无用的信息。
下面我们还是用实战来学习pandas这个功能。
1.5.1 任务一: 我们以"Age"为筛选条件,显示年龄在10岁以下的乘客信息。
df[df['Age'] < 10]
midage = df[(10 < df['Age']) & (50 > df['Age'])]
midage
【提示】了解pandas的条件筛选方式以及如何使用交集'&'和并集'|'操作
midage.loc[[100],['Pclass','Sex']]
注意:这里虽然成功显示了出来,但是这个并不一定就是第100行的数据(马后炮一手)
为了可以清楚的知道数据对应的行数,我们增加‘PassengerId’列,并且创建midage.csv文件
midage.loc[[100],['Pclass','Sex','PassengerId']]
midage.to_csv('midage.csv')
结果发现上面的数据并不是第100行,所以这里要用到reset_index()函数
详情见reset_index()函数的用法
midage = midage.reset_index(drop=True)
midage.loc[[100],['Pclass','Sex','PassengerId']]
midage.to_csv('midage.csv')
midage.loc[[100,105,108],['Pclass','Name','Sex']]
midage.iloc[[100,105,108],[2,3,4]]
【思考】对比iloc
和loc
的异同
loc:通过行标签索引行数据
当index 是整数:loc[n]表示索引的是第n行;当index 是字符:loc[‘d’]表示索引的是第’d’行
有行索引可以没有字段取值,但有字段取值前必须得有行索引,而且行索引只能为标签索引形式来取,不能按切片形式来取。单取切片形式可以,只是索引为左闭右闭。
iloc:通过行索引获取行数据
不能是字符,取索引必须按切片形式来取,不能按标签,这是与loc的不同。
索引为左闭右开。iloc也可以取指定行列,只不过得按切片形式索引,不能直接拿标签索引来做。
教材《Python for Data Analysis》第五章
import numpy as np
import pandas as pd
df = pd.read_csv('train_chinese.csv')
df
首先自己构建一个都为数字的DataFrame数据
df = pd.DataFrame(np.arange(8).reshape((2, 4)),
index=['2', '1'],
columns=['d', 'a', 'b', 'c'])
df
1.让行索引升序排序
df.sort_index()
2.让列索引升序排序
df.sort_index(axis=1)
3.让列索引降序排序
df.sort_index(axis=1, ascending=False)
4.让任选两列数据同时降序排序
df.sort_values(by=['a', 'c'], ascending=False)
df.sort_values(by=['票价', '年龄'], ascending=False)
【思考】排序后,如果我们仅仅关注年龄和票价两列。根据常识我知道发现票价越高的应该客舱越好,所以我们会明显看出,票价前20的乘客中存活的有14人,这是相当高的一个比例,那么我们后面是不是可以进一步分析一下票价和存活之间的关系,年龄和存活之间的关系呢?当你开始发现数据之间的关系了,数据分析就开始了。
我在创建了一个csv文件后发现,如果我们仅仅关注年龄和票价两列,我发现票价最高的100个人,最终存活了78人,而票价最低的100个人,最终只存活了15人,并且这15人皆为青壮年,由此可以看出票价越高的人的存活几率越高,年龄的差距主要是在票价低的群体中体现出来,因为青壮年遇到危险更容易逃生,当然,这只是我的想法,你还可以有更多想法,欢迎写在你的学习笔记中。
df_a = pd.DataFrame(np.arange(9.).reshape(3, 3),
columns=['a', 'b', 'c'],
index=['one', 'two', 'three'])
df_b = pd.DataFrame(np.arange(12.).reshape(4, 3),
columns=['a', 'e', 'c'],
index=['first', 'one', 'two', 'second'])
df = df_a + df_b
df
【提醒】两个DataFrame相加后,会返回一个新的DataFrame,对应的行和列的值会相加,没有
对应的会变成空值NaN。当然,DataFrame还有很多算术运算,如减法,除法等,有兴趣的同学可
以看《利用Python进行数据分析》第五章 算术运算与数据对齐 部分,多在网络上查找相关学习资
料。
df = pd.read_csv('train_chinese.csv')
max(df['兄弟姐妹个数'] + df['父母子女个数'])
结果是10人
df = pd.read_csv('train_chinese.csv')
df.describe()
df = pd.read_csv('train_chinese.csv')
df['票价'].describe()
df = pd.read_csv('train_chinese.csv')
df['父母子女个数'].describe()
从上面两组数据可以看出票价的波动很大,75%的人的票价都低于平均值,说明大部分人其实都没什么钱,不能拖家带口地上船,所以75%的人都是孤身一人,没有家人在身边,只有那些有钱的富人才会把一家人都带上船,所以票价高的人一般情况下的家人都比票价低的人的家人数量多。
当然,这只是我的想法,你还可以有更多想法,欢迎写在你的学习笔记中。
【总结】本节中我们通过Pandas的一些内置函数对数据进行了初步统计查看,这个过程最重要的不是大家得掌握这些函数,而是看懂从这些函数出来的数据,构建自己的数据分析思维,这也是第一章最重要的点,希望大家学完第一章能对数据有个基本认识,了解自己在做什么,为什么这么做,后面的章节我们将开始对数据进行清洗,进一步分析。