pandas中有两种数据结构Series和DataFrame,Series相似于Numpy中的一维数组,这里就不详细记录了。主要记录下DataFrame的常见使用。html
DataFrame是一个表格型的数据结构,它含有一组有序的列,每列能够是不一样的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它能够被看作由Series组成的字典(共用同一个索引)。python
下面记录DataFrame的常见使用,引入pandas约定:数组
from pandas import Series,DataFrame import pandas as pd
1. 建立一个DataFrame数据框数据结构
建立一个DataFrame最多见的方法是传入一个等长的列表或者Numpy数组组成的字典。app
In [16]: d = { ...: "name":["cat","dog","lion"], ...: "age":[3,5,6], ...: "sex":["male","female","male"] ...: } In [17]: d Out[17]: {'name': ['cat', 'dog', 'lion'], 'age': [3, 5, 6], 'sex': ['male', 'female', 'male']} In [18]: df = pd.DataFrame(d) In [19]: df Out[19]: name age sex 0 cat 3 male 1 dog 5 female 2 lion 6 male
2. 查看数据框的概述函数
In [20]: df.info() <class 'pandas.core.frame.DataFrame'> RangeIndex: 3 entries, 0 to 2 # 三个索引,从0到2 Data columns (total 3 columns): # 字段信息 name 3 non-null object # 字符串类型 age 3 non-null int64 # 整型 sex 3 non-null object # 字符串类型 dtypes: int64(1), object(2) # 统计数据类型信息 memory usage: 152.0+ bytes # 占用内存大小
3. 切片和索引code
3.1 基于列索引进行切片htm
In [24]: df.age Out[24]: 0 3 1 5 2 6 Name: age, dtype: int64 In [25]: df['age'] Out[25]: 0 3 1 5 2 6 Name: age, dtype: int64 In [26]: df[['age','name']] Out[26]: age name 0 3 cat 1 5 dog 2 6 lion
3.2 基于行索引进行切片
基于行索引进行切片有多种方法,好比DataFrame里的ix
函数,loc
函数和iloc
函数等。对象
In [27]: df.ix[0] D:\work-enviorament\anaconda\Scripts\ipython:1: DeprecationWarning: .ix is deprecated. Please use .loc for label based indexing or .iloc for positional indexing See the documentation here: http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated Out[27]: name cat age 3 sex male Name: 0, dtype: object
使用ix函数
能够进行行索引的切片,可是pandas建议使用loc或者iloc。索引
In [28]: df.ix[0:1] D:\work-enviorament\anaconda\Scripts\ipython:1: DeprecationWarning: .ix is deprecated. Please use .loc for label based indexing or .iloc for positional indexing See the documentation here: http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated Out[28]: name age sex 0 cat 3 male 1 dog 5 female In [29]: df[0:1] # 相似列表的切片操做 Out[29]: name age sex 0 cat 3 male In [30]: df[0:2] Out[30]: name age sex 0 cat 3 male 1 dog 5 female
一样,也可使用相似列表切片的操做进行行索引切片,不过ix函数的这种操做会包括右边的索引,切的范围不一样。
对于切出来的数据,数据类型仍是数据框的,能够继续切片(多重切片)。
In [36]: df[0:2]['name'] Out[36]: 0 cat 1 dog Name: name, dtype: object
4. 选取和修改值
In [37]: df Out[37]: name age sex 0 cat 3 male 1 dog 5 female 2 lion 6 male In [38]: df['age'] Out[38]: 0 3 1 5 2 6 Name: age, dtype: int64 In [39]: df['age'] = 10 # 基于整列的值都修改成10 In [40]: df Out[40]: name age sex 0 cat 10 male 1 dog 10 female 2 lion 10 male In [41]: df['age'][0] = 20 # 修改age列的第一行的值为20 In [42]: df Out[42]: name age sex 0 cat 20 male 1 dog 10 female 2 lion 10 male In [43]: df.age = [3,4,5] # 为多个字段赋值能够传入一个列表 In [44]: df Out[44]: name age sex 0 cat 3 male 1 dog 4 female 2 lion 5 male
5. 数据的筛选
某些状况下,须要根据一些数据进行筛选,好比筛选出年龄大于5岁的人或者居住地区为广州的人等等。
In [44]: df Out[44]: name age sex 0 cat 3 male 1 dog 4 female 2 lion 5 male In [46]: df.age == 4 # 逻辑判断,年龄等于4的,返回一个Series的布尔型数组 Out[46]: 0 False 1 True 2 False Name: age, dtype: bool In [47]: df[df.age == 4] # 根据这个布尔型数组进行索引,返回为True的 Out[47]: name age sex 1 dog 4 female In [48]: df[[False,True,False]] # 这种与上面方法是等价的 Out[48]: name age sex 1 dog 4 female In [51]: df.age > 3 # 大于小于也是能够的 Out[51]: 0 False 1 True 2 True Name: age, dtype: bool
这里也有个小技巧就是,在这些逻辑判断操做的前面加上~号,就能够反转结果,以下:
In [54]: df.age == 3 Out[54]: 0 True 1 False 2 False Name: age, dtype: bool In [55]: ~(df.age == 3) Out[55]: 0 False 1 True 2 True Name: age, dtype: bool
同时也支持多重筛选
In [57]: df Out[57]: name age sex 0 cat 3 male 1 dog 4 female 2 lion 5 male In [58]: (df.age == 3) & (df.name == 'cat') Out[58]: 0 True 1 False 2 False dtype: bool In [59]: df[(df.age == 3) & (df.name == 'cat')] Out[59]: name age sex 0 cat 3 male
pandas的query函数也能够达到筛选功能
In [66]: df.query("age == 3") Out[66]: name age sex 0 cat 3 male In [67]: df.query("(age == 3)&(sex=='male')") Out[67]: name age sex 0 cat 3 male
6. 使用loc与iloc
对于DataFrame的行的标签索引,引入了特殊的标签运算符loc和iloc。它们可让你用相似NumPy的标记,使用轴标签(loc)或整数索引(iloc),从DataFrame选择行和列的子集。
In [73]: df Out[73]: name age sex 0 cat 3 male 1 dog 4 female 2 lion 5 male In [74]: df.iloc[1] # 根据行标签进行索引,选取行索引为1的行 Out[74]: name dog age 4 sex female Name: 1, dtype: object In [75]: df.iloc[0:2] Out[75]: name age sex 0 cat 3 male 1 dog 4 female
若是行标签不是整数,而是字符串,那么就可使用loc了。
In [76]: df.index = list('abc') # 将行索引改成abc In [77]: df Out[77]: name age sex a cat 3 male b dog 4 female c lion 5 male In [78]: df.loc['a'] # 选取行索引为a的行 Out[78]: name cat age 3 sex male Name: a, dtype: object In [79]: df.loc[['a','b']] Out[79]: name age sex a cat 3 male b dog 4 female In [80]: df.iloc[0] # 一样也可使用iloc Out[80]: name cat age 3 sex male Name: a, dtype: object
iloc是根据具体的行的位置进行索引的,也就无论行标签是整数仍是字符串类型,而loc是根据行标签进行索引的。
loc和iloc还有支持多个参数进行索引
In [83]: df Out[83]: name age sex a cat 3 male b dog 4 female c lion 5 male In [84]: df.iloc[0:2] # 选取第一行和第二行 Out[84]: name age sex a cat 3 male b dog 4 female In [85]: df.iloc[0:2,1] # 选取列,列索引从0开始,因此选取第二列的数据 Out[85]: a 3 b 4 Name: age, dtype: int64 In [86]: df.iloc[0:2,[0,1]] # 选取多列 Out[86]: name age a cat 3 b dog 4
7. 丢弃DataFrame的行或者列
丢弃某条轴上的一个或多个项很简单,只要有一个索引数组或列表便可。因为须要执行一些数据整理和集合逻辑,因此drop方法返回的是一个在指定轴上删除了指定值的新对象:
对于DataFrame,能够删除任意轴上的索引值。用标签序列调用drop会从行标签(axis 0)删除值:
In [153]: dd Out[153]: name age sex 0 cat 3 male 1 dog 5 female 2 lion 6 male In [154]: dd.drop([1,2]) Out[154]: name age sex 0 cat 3 male
经过传递axis=1或axis='columns'能够删除列的值:
In [156]: dd Out[156]: name age sex 0 cat 3 male 1 dog 5 female 2 lion 6 male In [157]: dd.drop('sex',axis=1) Out[157]: name age 0 cat 3 1 dog 5 2 lion 6 In [158]: dd.drop('sex',axis='columns') Out[158]: name age 0 cat 3 1 dog 5 2 lion 6
8. DataFrame行,列的添加
如下面数据框为例:
In [182]: dd Out[182]: name age 0 cat 2 1 dog 3
以字典方式添加一行,忽略索引:
In [190]: row = {'name':'lion','age':4} In [191]: dd.append(row,ignore_index=True) Out[191]: name age 0 cat 2 1 dog 3 2 lion 4
使用loc,添加一行或者修改已存在行的内容:
In [206]: dd Out[206]: name age 0 cat 2 1 dog 3 In [207]: dd.loc[4] = ['lion','4'] In [208]: dd Out[208]: name age 0 cat 2 1 dog 3 4 lion 4 In [209]: dd.loc[1] = ['dog',5] In [210]: dd Out[210]: name age 0 cat 2 1 dog 5 4 lion 4
首先是数据的加载,pandas提供了一些用于将表格型数据读取为DataFrame对象的函数,经常使用的有read_csv
和read_table
。
以read_csv为例:
In [97]: df = pd.read_csv('dataAnalyst_gbk.csv',encoding="gbk") In [98]: df Out[98]: city education top avg work_year 0 上海 本科 9 8.0 3年 1 广州 硕士 15 11.0 2年 2 广州 本科 12 10.0 应届毕业生 3 北京 本科 13 12.0 2年 4 北京 本科 11 8.0 1年
read_csv函数
默认是以utf-8
格式进行文件的加载,而这个dataAnalyst_gbk.csv
文件是gbk格式的,因此须要enconding指定文件格式以解码。如上代码所示,read_csv函数将表格型数据加载为DataFrame对象。
csv文件默认是以逗号为分隔符,若是想指定分隔符,可使用sep参数,好比下面读取test.csv文件,而且以t为分隔符。
df = pd.read_csv('test.csv',sep='\t')
若是想对读取文件的字段名,也就是第一行的列名进行更改,能够在读取文件的时候使用names参数
:
In [111]: df = pd.read_csv('dataAnalyst_gbk.csv',encoding="gbk",names=['a','b','c','d','e']) In [112]: df # 能够看到列标签变成了abcde Out[112]: a b c d e 0 city education top avg work_year 1 上海 本科 9 8.0 3年 2 广州 硕士 15 11 2年 3 广州 本科 12 10 应届毕业生 4 北京 本科 13 12 2年 5 北京 本科 11 8 1年
在获取数据后,即可以对数据进行进一步的分析,清洗等操做,下面记录一些常见的使用。
1. head()函数,默认显示前5行
对于一些很是庞大的数据框,使用head()能够简要的查看数据,head默认显示前5行,能够传递数字让pandas显示多少行。
In [116]: df.head() Out[116]: city education top avg work_year 0 上海 本科 9 8.0 3年 1 广州 硕士 15 11.0 2年 2 广州 本科 12 10.0 应届毕业生 3 北京 本科 13 12.0 2年 4 北京 本科 11 8.0 1年 In [117]: df.head(3) Out[117]: city education top avg work_year 0 上海 本科 9 8.0 3年 1 广州 硕士 15 11.0 2年 2 广州 本科 12 10.0 应届毕业生
固然,若是想看尾部的数据,能够用tail函数
,它默认显示尾部的5行,与head相反。
2. 更改数据类型
使用df.info()
函数能够看到各个列的数据类型,实际分析中也有需求去更改它的数据类型
In [120]: df.info() <class 'pandas.core.frame.DataFrame'> RangeIndex: 5 entries, 0 to 4 Data columns (total 5 columns): city 5 non-null object education 5 non-null object top 5 non-null int64 avg 5 non-null float64 work_year 5 non-null object dtypes: float64(1), int64(1), object(3) memory usage: 280.0+ bytes
pandas提供了astyp()函数
进行数据类型的更改,例以下面将top列的值的数据类型更换为字符串类型。
In [122]: df.top Out[122]: 0 9 1 15 2 12 3 13 4 11 Name: top, dtype: int64 # 默认是int64 In [123]: df.top.astype('str') Out[123]: 0 9 1 15 2 12 3 13 4 11 Name: top, dtype: object # 已经更改成字符串类型
须要注意的是df.top.astype('str')
并不会去修改原先数据框的数据类型,而是新建了一个,若是想对原先的数据框进行修改,须要进行赋值操做df.top = df.top.astype('str')
。
In [124]: df.top = df.top.astype('str') In [125]: df.top Out[125]: 0 9 1 15 2 12 3 13 4 11 Name: top, dtype: object
3. 进行一些简单的数值计算以及筛选过滤
In [129]: df Out[129]: city education top avg work_year 0 上海 本科 9 8.0 3年 1 广州 硕士 15 11.0 2年 2 广州 本科 12 10.0 应届毕业生 3 北京 本科 13 12.0 2年 4 北京 本科 11 8.0 1年 In [130]: df['avg_2'] = df.avg*2 # 增长新的一列,数据为avg数值的两倍 In [131]: df Out[131]: city education top avg work_year avg_2 0 上海 本科 9 8.0 3年 16.0 1 广州 硕士 15 11.0 2年 22.0 2 广州 本科 12 10.0 应届毕业生 20.0 3 北京 本科 13 12.0 2年 24.0 4 北京 本科 11 8.0 1年 16.0
找出平均薪资大于10K的数据或者平均薪资大于10K的城市:
In [133]: df.query('avg>10') Out[133]: city education top avg work_year avg_2 1 广州 硕士 15 11.0 2年 22.0 3 北京 本科 13 12.0 2年 24.0 In [134]: df.query('avg>10').city Out[134]: 1 广州 3 北京 Name: city, dtype: object