读入数据
读入少量数据
- 查看或修改工作目录
import os
os.getcwd() # 查看当前工作目录current working directory
os.chdir('路径') # 修改工作目录,可以将其修改为数据存放位置
-
读入数据
.xlsx数据:
pd.read_excel(r"路径",sheet_name)
。要注意当有多个sheet时需要设置sheet_name
参数,不设置时默认读第一个,None默认读所有,可以时sheet的名字,也可以时sheet的索引(从0开始)。csv文件:
pd.read_csv(r"路径",sep)
,默认分隔符为逗号。tsv文件:
pd.read_table(r"路径",sep)
,默认分隔符为制表符\t。-
注意:
tsv文件和csv文件:tsv是以制表符\t分隔值,及tab-seperated values,而csv文件则是以逗号分隔,及comma-seperated values。
pd.read_table()
和pd.read_csv()
两者的区别也是前者默认分隔符为制表符,后者是逗号,可以通过sep
参数修改默认分隔符从而实现相同的效果。输入路径时,可以r+''或者'\'或者'/'表示。
读入一般的文本文件:打开文件,读取文件内容,关闭文件
f = open('路径','打开模式') f.write('写入内容') f.close()</pre>
读入数据的路径:相对路径和绝对路径
-
本次练习
import numpy as np import pandas as pd import os os.getcwd() # 查看当前工作目录 train = pd.read_csv('./train.csv') # 根据相对路径读入 test = pd.read_csv("F:/pythondoc/hands-on-data-analysis/第一单元项目集合/test_1.csv") # 根据绝对路径读入 train.head(10) # 查看前10行数据 test.tail(10) # 查看后10行数据
读入大量数据
当数据量较大时,
pd.read_csv
可能会报错memory error,此时可以通过逐块读取解决该问题。同时也方便读取其中的一部分数据或对文件进行逐块处理。-
逐块读取方法一:通过设置
chunksize
参数实现chunker = pd.read_csv('./train.csv',chunksize=100) # 读入数据,每个数据块的大小是100 print(type(chunker)) # 查看数据类型 chunkcount = 0 # 即分的数据块的个数初始值 for chunk in chunker: print(chunk) chunkcount+=1 # 计算分了多少个数据块,如共2000个数据,每个数据块大小为100,则最终是20个数据块,chunkcount=20 print(chunkcount) chunker.get_chunk(n) # 读取大小为n的数据块,多次运行时会从上次读的结束位置继续往下读,而不是从头开始读
读取的chunker数据块的类型:TextFileReader,可迭代对象
for循环可打印输出每一个数据块,如上所示
get_chunk()
方法:读取任意大小的块
-
逐块读取方法二:设置
iterator=True
实现chunker = pd.read_csv('./train.csv',iterator=True) chunk = chunker.get_chunk(5) # 读前5行数据 chunk = chunker.get_chunk(5) # 从上一个结束往后再读5个
- 注意:这里是连续读,会从上一次读的结束的继续读
修改DataFrame的列名
-
方法一:在读入的同时修改
names=[列名]
参数修改列名pd.read_csv('路径',names=['列名1','列名2',...]) # 要写入所有的列名 # 本例中 train = pd.read_csv('./train.csv', names=['乘客ID','是否幸存', '乘客等级(1/2/3等舱位)','乘客姓名','性别', '年龄','堂兄弟/妹个数','父母与小孩个数','船票信息','票价','客舱','登船港口'])
-
方法二:
df.columns=[列名]
进行修改df.columns=['列名1','列名2',...] # 需要输入所有列名 # 本例中 train.columns = ['乘客ID','是否幸存', '乘客等级(1/2/3等舱位)','乘客姓名','性别', '年龄','堂兄弟/妹个数','父母与小孩个数', '船票信息','票价','客舱','登船港口']
-
方法三:
df.renames(columns={'原列名':'新列名'})
df.renames(columns={'原列名':'新列名',...}) # 只需要输入要修改的列名,不用输入所有 # 本例中,假设只修改乘客ID train.renames(columns={'PassengerId','乘客Id'})
初步观察数据
观察数据
-
主要包括:数据大小,行数,列数,各列时什么格式,是否包含null值等
train.shape # 数据的行列数 train.info() # 查看每一列的数据类型,非空值个数 train['乘客ID'.dtype] # 查看某一列数据类型 train.describe() # 描述性统计,查看非空值个数,均值,标准差,最大值,最小值,分位数 train['乘客ID'].astype("float64") # 修改数据类型
-
查看前n行
df.head(n)
和后n行数据df.tail(n)
train.head(10) # 查看前10行数据,默认为5 train.tail(15) # 查看后15行数据,默认为5
-
判断数据是否为空
df.isnull()
若空则返回Truetrain.isnull().head() # 判断数据是否为空并输出前5行
-
保存数据
df.to_csv('路径',encoding)
train.to_csv('train_Chinese',encoding='utf-8')
-
查看数据常用方法
df.head(n)
查看前n行数据 df.tail(n)
查看后n行数据 df.shape
查看行数和列数 df.info()
查看有哪些列,非空值个数,数据类型 df.describe()
描述性统计,计数,均值,标准差,最大值最小值,分位数 df.unique()
查看数据列有哪些分类内容 Series.value_counts()
查看表格某列中有多少各不同值,并计算每个不同值在该列中有多少重复值。时series拥有的方法,在df中用需要指定某一列,返回的也是series df.apply(pd.Series.value_counts)
查看df中每一列的唯一值和计数
Pandas基础
pandas中的两种数据类型
-
Series
-
特点:
一维数组,由数据values和索引index组成
可以简单地看作dataframe中地一列
-
创建
列表创建,不指定索引:
pd.Series([值1,值2,...])
,不指定索引时则默认从0开始列表创建,指定索引:
pd.Series([值1,值2,...],index=[index1,index2,...])
,输出时第一列为索引,第二列为数据字典创建:(因为和字典很像)
pd.Series({"key1":value1,"key2":value2,...})
,创建后key是索引,value是值。此时已经有索引,不能再通过pd.Series(字典,index=[])
来指定索引了,这样的效果是和reindex
一样,即按照新的Index顺序从数据中取出对应的数据,如果没有这个index则返回NaN。reindex
不是改索引的。s1.reindex([1,3,6])
,根据索引1.3.6找出s1中对应的值,有则显示,没有则为NaNSeries.index=[]
是改变index的。
-
-
DataFrame
一组有序的列,和Excel中的表格很类似,一列必须是同一个类型数据,列于列之间可以是不同类型。类似于多个Series。
DataFrame既有行索引也有列索引,自己简化理解是行是Index,列是列名。
构建方法
pd.DataFrame('等长字典或numpy')
:
```
# 方法一:由等长列表组成的字典
data = {
"state":['a','n','h','d'], # state是列名或者说列索引
'year':[2001,2004,2007,2018],
'name':['lily','lucy','tom','tony']
}
frame1 = pd.DataFrame(data)
frame1 = pd.DataFrame(data,columns=['year','name','state']) # 指定列的顺序
# 也可以通过index=[]生成行索引
# 通过Numpy创建
data2 = np.random.randn(6,4)
frame2 = pd.DataFrame(data2,columns=list('ABCD'))
```
DataFrame数据的基础操作
-
查看某列的值
df.列名
df['列名']
-
删除某列
del df['列名']
:直接从数据中永久删除-
df.drop(labels=None,axis=0,index=None,columns=None,inplace=False)
labels
:要删除的行或列的名字,用列表给定axis
:默认为0,删除行;若要删除列,则需要指定axis=1index
:直接指定要删除的行columns
:直接指定要删除的列inplace
默认为False,不改变原数据,返回一个新的数据框,true则直接在原数据上修改。所以删除有两种方式,①labels=None,axis=0的组合,此时若输入一个列名而axis=0则会报错;②index或column直接指定要删除的行或列
-
本例中
# 方法一:直接用columns列名删除/index行索引删除 test.drop(columns='a') # 方法二:用labels名字+axis删除 test.drop(labels='a',axis=1) # 方法三:del永久删除 del test['a']
筛选数据
类型 | 说明 |
---|---|
df[val] |
选取一列或一组列;布尔型过滤符合条件的列;切片选行 |
df.loc[val] |
通过标签,选择df中的单个行或一组行 |
df.loc[:,val] |
通过标签,选取单列或一组列 |
df.loc[val1,val2] |
通过标签,同时选取行和列 |
df.iloc[where] |
通过整数位置,从df中选取单个行或行子集 |
df.iloc[:,where] |
通过整数位置,从df中选取单个列或列子集 |
df.iloc[where_i,where_j] |
通过整数位置,同时选取行和列 |
reindex |
通过标签选取行或列 |
-
df[val]
的用法选取一列:
df[列名1]
选取一组列:
df[[列名1,列名2,...]]
布尔型过滤符合条件的行:
df[df.列名>值]
,交&并|切片选行:
df[:3]
即前3行数据,不能写成df[0,1,2]
会报错,只能写一个值,如df[[0,1,2]]
但此时是找列名为0,1,2的列
-
iloc和loc的不同
iloc是通过整数位置来选取,即interger location
loc是通过标签选取
-
本例中
# 显示年龄在10岁以下的乘客信息 train[train.Age<10].head() # 显示奈年龄在10岁以上和50岁以下的乘客信息 midage = train[(train.Age>10) & (train.Age<50)] midage.head(30)
-
reset_index()
具体参考:reset_index()
-
作用:
重置dataframe的索引,并使用默认索引。即如果原来设置了别的索引,会改为默认索引
若原来有多个索引,比如有两/多列数据都是行索引,则可以删除一个或多个行索引级别,让行索引变成列
语法:
reset_index(level=None,drop=False,inplace=False,col_level=0,col_fill="")
-
本例中
# 任务四:将上述通过年龄筛选到的midage的第100行的Pclass和Sex数据提取出来 # 从midage的输出结果中可以看到其index是不连续的还是train的index # 所以必须reindex()来重置索引才可以渠道midage的第100行数据 midage = midage.reset_index(drop=True) # 即重置索引,且删掉原来的索引 midage.loc[[100],['Pclass','Sex']] # 实际上取到的是第101行数据,因为索引是从0开始的 # 任务五:使用iloc方法将midage中第100,105,108行的Pclass,Name,Sex midage.iloc[[100,105,108],[2,3,4]]
探索性数据分析
DataFrame排序
按行索引升序排序 |
df.sort_index() 默认行,默认升序 |
---|---|
按列索引升序排序 | df.sort_index(axis=1) |
按列索引降序排序 | df.sort_index(axis=1,ascending=False) |
按列的值升序排序 | df.sort_values(by=[列1,列2,...]) |
-
本例中
# 按票价和年龄两列降序排列 train.sorted = train.sort_values(by=['票价','年龄'],ascending=False)
- 结果中发现票价越高,存活的人数越多,票价前20中存活的有14个人。所以为后续分析提供了基础,票价和是否存活是高度相关的。
DataFrame相加
-
语法:
df1+df2
- 对应的行和列,即行索引和列名称相同的相加,没有对应值的会变成空值NaN
其他运算
-
本例中
# 计算穿上最大的家族有多少人 max(train['堂兄弟/妹个数']+train['父母与小孩个数']) # 基本统计信息,这个之前已经总结过使用describe() train.describe() # 票价,父母子nv的基本统计数据 train['票价'],describe() train['父母与小孩个数'].describe()
主要就是对计数,平均值,标准差,分位数进行分析。
以票价为例:一共有891个非空票价数据,均值为32.2元,标准差为49、69,说明票价的波动是很大的,一方面也反映了坐船人的经济差距。最大值是512.33,最小值为0.