网站首页 > 基础教程 正文
第一章:第一节数据载入及初步观察
通过对实际数据的探索,掌握python常用的数据分析操作
数据下载
本次课程使用的数据来源于Kaggle:
数据集下载 https://www.kaggle.com/c/titanic/overview
导入工具包
import pandas as pd
import numpy as np
#本人使用Anaconda集成的python开发环境,不需要再安装相应包,如果需要安装可以使用 pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple 安装pandas 将自动安装numpy
123
导入数据
使用相对路径载入数据
train_df=pd.read_csv("train.csv")
train_df.head(5)
12
使用绝对路径载入数据
我使用安装Anaconda的服务器进行操作,所以我并不知道上传的数据文件的真实路径需要使用一些命令来查看当前目录
方法1
使用os包
import os
os.getcwd()
12
方法2
使用ipython的魔术方法
!pwd
1
上述两种方法都可以使用,但是os.getcwd()可直接用于参数传递,所以我选择方法1
train_df=pd.read_csv(os.getcwd()+'/train.csv')
train_df.head(5)
123
思考
知道数据加载的方法后,试试pd.read_csv()和pd.read_table()的不同,如果想让他们效果一样,需要怎么做?了解一下’.tsv’和’.csv’的不同,如何加载这两个数据集?
read_csv和read_table区别在于默认分隔符的不同,read_table的默认分隔符为"\t",可通过sep参数调整
TSV与CSV的区别:
1)从名称上即可知道,TSV是用制表符(Tab,’\t’)作为字段值的分隔符;CSV是用半角逗号(’,’)作为字段值的分隔符;
2)IANA规定的标准TSV格式,字段值之中是不允许出现制表符的。
每1000行为一个数据模块,逐块读取
df_chunk=pd.read_csv("train.csv",chunksize=1000)
1
DataFrame 对于大数据的读取、操作需要消耗大量的内存、IO,分块读取可以减少资源消耗,提高效率
将表头改成中文,索引改为乘客ID [对于某些英文资料,我们可以通过翻译来更直观的熟悉我们的数据]
#方法1
train_df=pd.read_csv("train.csv",names=['乘客ID','是否幸存','乘客等级(1/2/3等舱位)','乘客姓名','性别','年龄','堂兄弟/妹个数','父母与小孩个数','船票信息','票价','客舱','登船港口'],index_col="乘客ID")
#方法2
df1=pd.read_csv('train.csv')
df1.rename(columns={'Survived':'是否幸存', 'Pclass':'仓位等级', 'name':'姓名'}, inplace = True)#另一种修改列名的方法,可以修改部分或者全部
df1.head()
#方法3
df2=pd.read_csv('train.csv')
df2.columns=['乘客ID','是否幸存','仓位等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数','船票信息','票价','客舱','登船港口']
#该方法的新列名必须要与原列名一一对应
df2.head()
1234567891011
初步观察
导入数据后,你可能要对数据的整体结构和样例进行概览,比如说,数据大小、有多少列,各列都是什么格式的,是否包含null等
查看数据的基本信息
train_df.info()
'''
<class 'pandas.core.frame.DataFrame'>
Index: 892 entries, PassengerId to 891
Data columns (total 11 columns):
是否幸存 892 non-null object
乘客等级(1/2/3等舱位) 892 non-null object
乘客姓名 892 non-null object
性别 892 non-null object
年龄 715 non-null object
堂兄弟/妹个数 892 non-null object
父母与小孩个数 892 non-null object
船票信息 892 non-null object
票价 892 non-null object
客舱 205 non-null object
登船港口 890 non-null object
dtypes: object(11)
memory usage: 83.6+ KB
'''
12345678910111213141516171819
观察表格前10行的数据和后15行的数据
前10行
train_df.head(10)
train_df.iloc[:10,:]
12
后15行
train_df.tail(15)
train_df.iloc[-15:,:]
12
判断数据是否为空,为空的地方返回True,其余地方返回False
train_df.isnull()
1
保存数据
将你加载并做出改变的数据,在工作目录下保存为一个新文件train_chinese.csv
train_df.to_csv("train_chinese.csv",sep=',',encoding='utf-8')
12
知道你的数据叫什么
任务一:pandas中有两个数据类型DateFrame和Series,通过查找简单了解他们。然后自己写一个关于这两个数据类型的小例子
#写入代码
Se1=pd.Series({'a':1,'b':2,'c':3})
Se1#Series
df_1=pd.DataFrame({'a':[1,2],'b':[3,4],'c':[5,6]})
df_1#DataFrame
12345
任务二:根据上节课的方法载入"train.csv"文件
df=pd.read_csv("train.csv")
1
任务三:查看DataFrame数据的每列的项
df.columns
'''
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
dtype='object')
'''
123456
任务四:查看"cabin"这列的所有项 [有多种方法]
df['Cabin'].head(3)
df.Cabin.head(3)
df.loc[:,"Cabin"].head(3)
df.iloc[:,10].head(3)
df.ix[:,"Cabin"].head(3)
12345
任务五:加载文件"test_1.csv",然后对比"train.csv",看看有哪些多出的列,然后将多出的列删除
test_1=pd.read_csv("test_1.csv")
test_1.head()
12
任务六: 将[‘PassengerId’,‘Name’,‘Age’,‘Ticket’]这几个列元素隐藏,只观察其他几个列元素
df.drop(['PassengerId','Name','Age','Ticket'],axis=1)
#设置inplace=True,则永久删除上述几列
12
对比任务五和任务六,是不是使用了不一样的方法(函数),如果使用一样的函数如何完成上面的不同的要求呢?
可以使用索引的方式实现drop功能
df.loc[:,['Survived','Pclass','Sex','SibSp','Parch','Fare','Cabin','Embarked']]
1
筛选的逻辑
任务一: 我们以"Age"为筛选条件,显示年龄在10岁以下的乘客信息。
df[df['age']<10]
1
任务二: 以"Age"为条件,将年龄在10岁以上和50岁以下的乘客信息显示出来,并将这个数据命名为midage
midage=df[(df['age']>10)&(df['age']<50)]
1
任务三:将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来
midage.reset_index(drop = True)#重新设置索引因为切片可能会造成索引缺失
midage.loc[100,['Pclass','Sex']]
midage.loc[[100],['Pclass','Sex']]
#两种显示效果不一样
1234
任务四:将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
midage.loc[[100,105,108],['Pclass','Name','Sex']]
12
任务五:使用iloc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
midage.iloc[[100,105,108],[2,3,4]]
1
探索性数据分析
导入numpy、pandas包和数据
import numpy as np
import pandas as pd
df1=pd.read_csv("train_chinese.csv")
123
任务一:利用Pandas对示例数据进行排序,要求升序
#生成示例数据
a=pd.DataFrame(np.arange(8).reshape(2,4),index=[2,1],columns=['d','c','b','a'])
#构建的DataFrame中的数据根据某一列,升序排列
a.sort_value(by='a',ascending=True)
#让行索引升序排序
a.sort_index()
#让列索引升序排序
a.sort_index(axis=1)
#让列索引降序排序
a.sort_index(axis=1,ascending=False)
#让任选两列数据同时降序排序
a.sort_values(by=['a', 'c'])
123456789101112
任务二:对泰坦尼克号数据(trian.csv)按票价和年龄两列进行综合排序(降序排列),从这个数据中你可以分析出什么?
df1.sort_values(by=['票价','年龄'],ascending=False).head(20)
1
排序后,如果我们仅仅关注年龄和票价两列。根据常识我知道发现票价越高的应该客舱越好,所以我们会明显看出,票价前20的乘客中存活的有14人,这是相当高的一个比例,那么我们后面是不是可以进一步分析一下票价和存活之间的关系,年龄和存活之间的关系呢?当你开始发现数据之间的关系了,数据分析就开始了。
年龄
df1['年龄']=df1['年龄'].map(lambda x: float(x))
df1.sort_values(by='年龄',ascending=True).head(20)
df1.sort_values(by='年龄',ascending=False).head(20)
123
票价
df1['票价']=df1['票价'].map(lambda x: float(x))
df1.sort_values(by='票价',ascending=False)
12
#写下你的思考
#数据中年龄排序出现按9>80>8>74…的情况,因为“年龄”列的数据目前的类型为字符串类型,需要手动转化为float类型
#年龄越小存活概率越高,年龄越大存活概率越低
任务三:利用Pandas进行算术计算,计算两个DataFrame数据相加结果
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
#减
frame1_a - frame1_b
#乘
frame1_a * frame1_b
#除
frame1_a / frame1_b
frame1_a.div(frame1_b)
123456789101112131415
任务四:通过泰坦尼克号数据如何计算出在船上最大的家族有多少人?
#代码
def jiatingrenshu(x,y):
return int(x)+int(y)
df1['家族人数']=df1.apply(lambda x:jiatingrenshu(x['堂兄弟/妹个数'],x['父母与小孩个数']),axis=1)
max(df1['家族人数'])
12345
任务五:学会使用Pandas describe()函数查看数据基本统计信息
frame2 = pd.DataFrame([[1.4, np.nan],
[7.1, -4.5],
[np.nan, np.nan],
[0.75, -1.3]
], index=['a', 'b', 'c', 'd'], columns=['one', 'two'])
frame2.describe()
"""
one two
count 3.000000 2.000000
mean 3.083333 -2.900000
std 3.493685 2.262742
min 0.750000 -4.500000
25% 1.075000 -3.700000
50% 1.400000 -2.900000
75% 4.250000 -2.100000
max 7.100000 -1.300000
"""
1234567891011121314151617
任务六:分别看看泰坦尼克号数据集中 票价、父母子女 这列数据的基本统计数据,你能发现什么?
df1['票价'].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
'''
#最贵的票价高达512
#有人使用免费票
#75%的人购买的票价小于总体样本的均值
123456789101112131415
总结
对于导入的数据一定要注意其数据类型,因类型的限制可能很多统计指标无法实现
猜你喜欢
- 2024-10-28 pandas 与 GUI 界面的超强结合,爆赞
- 2024-10-28 了解Python数据分析库:如何在几秒内处理数十亿行的DataFrame?
- 2024-10-28 如何基于RDD方式完成DataFrame的代码构建?
- 2024-10-28 pandas基础教程(四) DataFrame的前世今生
- 2024-10-28 推荐收藏!10个相见恨晚的Pandas函数,太好用了
- 2024-10-28 Pandas 数据结构之 DataFrame使用教程
- 2024-10-28 Pandas 数据结构 - DataFrame pandas数据类型有哪些
- 2024-10-28 如何在 Python 中创建DataFrame,教你七种方法玩转DataFrame
- 2024-10-28 超简单!Pandas DataFrame 高效数据分析入门指南
- 2024-10-28 Pandas使用系列(二):Dataframe常用操作方法
- 05-14CSS基础知识(一) CSS入门
- 05-14CSS是什么? CSS和HTML有什么关系?
- 05-14什么是CSS3?
- 05-14CSS如何画一个三角形?
- 05-14初识CSS——CSS三角制作
- 05-14Wordpress建站教程:给图片添加CSS样式
- 05-14HTML和HTML5,css和css3的区别有哪些?
- 05-14Html中Css样式Ⅱ
- 最近发表
- 标签列表
-
- jsp (69)
- pythonlist (60)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- mysql教程 (60)
- pythonif (86)
- location.href (69)
- deletesql (62)
- c++模板 (62)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- console.table (62)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)