pandas
转载于: http://c.biancheng.net/pandas/
pandas主要特点
提供一个简单、高效、带有默认标签(也可以自定义标签)的DataFrame对象;
能够快速得从不同格式的文件中加载数据(如:Excel、CSV、SQL文件),然后将其转换为可处理的对象;
能够按照数据的行、列标签进行分组,并对分组后的对象执行聚合和转换操作;
能够很方便地实现数据归一化操作和缺失值处理;
能够很方便地对DataFrame的数据列进行增加、修改、或者删除的操作;
能够处理不同格式的数据集,比如:矩阵数据、异构数据表、时间序列等;
提供了多种处理数据集的方式,如:构建子集、切片、过滤、分组等;
pandas主要优势
DataFrame和Series构建了适应于数据分析的存储结构;
简洁的API;
实现与其他库的集成,如:Matplotlib、scikit-learn等
pandas内置数据结构
在ndarray数据(numpy中的数组)的基础上构建了两种不同的数据结构:
Series(一维数据结构):带列标签,可以理解为索引,不局限于整数,也可以是字符类型。
DataFrame(二维数据结构):一种表格型数据结构,它既有行标签,也有列标签。
1. Series
Series结构,也称Series序列,由一组数据值(value)和一组标签组成,其中标签与数据值之间是一一对应关系。
1.1 创建Series对象
df=pd.Series( data, index, dtype, copy)
参数:
1.1.1 ndarray创建Series对象
ndarray 是 NumPy 中的数组类型,当 data 是 ndarry 时,传递的索引必须具有与数组相同的长度。假如没有给 index 参数传参(这种设置方式称为“隐式索引”),在默认情况下,索引值将使用是 range(n) 生成,其中 n 代表数组长度。
例:使用“显示索引”
import pandas as pd
import numpy as np
data = np.array(['a','b','c','d'])
#自定义索引标签(即显示索引)
s = pd.Series(data,index=[100,101,102,103])
s
1.1.2 dict(字典)创建Series对象
把dict作为输入数据,如果没有传入索引时会按照字典的键来构造索引,反之,当传递了索引时需要将索引标签与字典中的值一一对应。
例一:没有传索引时
data = {"a": 1, "b":2, "c":3}
s = pd.Series(data)
print(s)
例二:未index参数传递索引时
data = {"a": 1, "b":2, "c":3}
s = pd.Series(data,index=['b','c','d','a'])
print(s)
注:当传递的索引值无法找到对应的值时,使用NaN(非数字)填充。
1.1.3 标量创建Series对象
如果data是标量值,则必须提供索引。
s = pd.Series(5, index=[0, 1, 2, 3])
print(s)
注:标量值按照index的数量进行重复,并一一对应。
1.2 访问Series数据
1.2.1 位置索引访问/索引标签访问
这种访问方式与 ndarray 和 list 相同,使用元素自身的下标进行访问。我们知道数组的索引计数从 0 开始,这表示第一个元素存储在第 0 个索引位置上,以此类推,就可以获得 Series 序列中的每个元素。
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print(s[0]) #位置访问
print(s['a']) #标签访问
通过切片的方式访问Series序列中的数据:
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print(s[:3])
1.3 Series常用属性
s = pd.Series(np.random.randn(5))
print(s)
#
print("---------axes---------")
print(s.axes)
print("---------dtype---------")
print(s.dtype)
# 返回一个布尔值,用于判断数据对象是否为空
print("---------empty---------")
print("是否为空对象?")
print (s.empty)
# 查看序列的维数。根据定义,Series 是一维数据结构,因此它始终返回 1
print("---------ndim---------")
print (s.ndim)
# 返回 Series 对象的大小(长度)
print("---------size---------")
print(s.size)
# 以数组的形式返回 Series 对象中的数据
print("---------values---------")
print(s.values)
# 该属性用来查看 Series 中索引的取值范围
print("---------index---------")
s=pd.Series([1,2,5,8],index=['a','b','c','d'])
print(s.index)
#隐式索引
s1=pd.Series([1,2,5,8])
print(s1.index)
2. DataFrame
2.1 DataFrame结构
一个表格型的数据结构,有行标签(index),又有列标签(columns),它也被称异构数据表,异构指的是表格中每列的数据类型可以不同比如可以使字符串、整型、浮点型等。
2.2 创建DataFrame对象
语法:
import pandas as pd
pd.DataFrame( data, index, columns, dtype, copy)
参数:
2.2.1 列表创建DataFrame对象
可以使用单一列表或嵌套列表创建一个DataFrame
例一:单一列表创建
data = [1,2,3,4,5]
df = pd.DataFrame(data)
print(df)
例二:使用嵌套列表创建
data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'])
print(df)
2.2.2 字典嵌套列表创建
data字典中,键对应的值的元素长度必须相同(也就是列表长度相同)。如果传递了索引,那么索引的长度应该等于数组的长度;如果没有传递索引,那么默认情况下,索引将是range(n),其中n代表数组长度。
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]}
df = pd.DataFrame(data)
print(df)
2.2.3 列表嵌套字段创建DataFrame对象
列表嵌套字典可以作为输入数据传递给DataFrame构造函数。默认情况下,字典的键被用作列名。
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data)
print(df)
2.3 列索引操作DataFrame
可以使用列索引(columns index)引来完成数据的选取、添加和删除操作。
2.3.1 列索引添加数据列
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
# 使用df['列']=值,插入新的数据列
df['three']=pd.Series([10,20,30],index=['a', 'b', 'c'])
print(df)
# 将已经存在的数据列做相加运算
df['four']=df['one'] + df['three']
print(df)
除了使用df[]=value的方式外,还可以使用insert()方法插入新的列:
info=[['Jack',18],['Helen',19],['John',17]]
df=pd.DataFrame(info,columns=['name','age'])
print(df)
#注意是column参数
#数值1代表插入到columns列表的索引位置
df.insert(1, column='score',value=[11,22,33])
print(df)
2.3.2 列索引删除数据列
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd']),
'three' : pd.Series([10,20,30], index=['a','b','c'])}
df = pd.DataFrame(d)
print(df)
# 使用del删除
del df['one']
print(df)
# 使用pop方法删除
df.pop('two')
print(df)
2.3.3 行索引操作DataFrame
1. 标签索引选取
可以将行标签传递给 loc 函数,来选取数据。
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print(df.loc['b'])
注意:loc 允许接两个参数分别是行和列,参数之间需要使用“逗号”隔开,但该函数只能接收标签索引。
2. 整数索引选取
通过将数据行所在的索引位置传递给 iloc 函数,也可以实现数据行选取。
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print (df.iloc[2])
注意:iloc 允许接受两个参数分别是行和列,参数之间使用“逗号”隔开,但该函数只能接收整数索引。
3. 切片操作多行选取
可以使用切片的方式同时选取多行。
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
#左闭右开
print(df[2:4])
4. 添加数据行
使用 append() 函数,可以将新的数据行添加到 DataFrame 中,该函数会在行末追加数据行。
df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])
df2 = pd.DataFrame([[5, 6], [7, 8]], columns = ['a','b'])
#在行末追加新数据行
df = df.append(df2)
print(df)
5. 删除数据行
可以使用行索引标签,从 DataFrame 中删除某一行数据。如果索引标签存在重复,那么它们将被一起删除。
df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])
df2 = pd.DataFrame([[5, 6], [7, 8]], columns = ['a','b'])
df = df.append(df2)
print(df)
#注意此处调用了drop()方法
df = df.drop(0)
print (df)
默认使用 range(2) 生成了行索引,并通过 drop(0) 同时删除了两行数据。
2.4 常用属性和方法汇总
2.5 pandas描述性统计
2.6 pandas csv读取文件
文件的读写操作属于计算机的IO操作,pandas IO操作提供了一些读取器函数,比如 pd.read_csv()、pd.read_json 等,它们都返回一个 Pandas 对象。
语法:
pandas.read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer',names=None, index_col=None, usecols=None)
# 指定一个列,然后使用index_col可以实现自定义所以
df=pd.read_csv("C:/text.csv",index_col=['ID'])
# 转换salary字段为float类型
df=pd.read_csv("C:/text.csv",dtype={'salary':np.float64})
# 自定义文件标头名,但是原来的标头名(列标签名)并没有被删除,此时可以使用header参数来删除它。
df=pd.read_csv("C:/text.csv",names=['a','b','c','d','e'],header=0)
# 跳过指定的行号,注:标头也算是一行
df=pd.read_csv("C:/text.csv",skiprows=2)