#公认的pandas导包方式
import pandas as pd
pandas有两个常用的数据结构:Series和DataFrame,他们为很多问题提供了解决模板
Series是一种一维的数组型对象,它包含了一个值序列,并且包含了数据标签,称为索引,最简单的序列可以仅仅由一个数组形成
obj = pd.Series([4,7,-5,3])
print(obj)#输出的数据中左边为索引,右边为数据
obj1 = pd.Series([4,7,-5,3], index=['a', 'b', 'c', 'd'])#指定索引
print(obj1)
0 4 1 7 2 -5 3 3 dtype: int64 a 4 b 7 c -5 d 3 dtype: int64
在Series中你可以使用索引进行取值
print(obj[1])
print(obj1['a'])
print(obj1[['a', 'b','d']])
7 4 a 4 b 7 d 3 dtype: int64
在Series中也可以进行数学操作
import numpy as np
print(obj1[obj1>0])
print(obj1*2)
print(np.exp(obj1))
a 4 b 7 d 3 dtype: int64 a 8 b 14 c -10 d 6 dtype: int64 a 54.598150 b 1096.633158 c 0.006738 d 20.085537 dtype: float64
如果你已经有数据包含在python的字典中,可以使用字典直接生成Series:
sdata = {'Ohio':35000, 'Texas':71000, 'Oregon':16000, 'Utah':5000}
obj2 = pd.Series(sdata)
print(obj2)
Ohio 35000 Texas 71000 Oregon 16000 Utah 5000 dtype: int64
DataFrame表示的是矩阵的数组表,它包含以排序的列集合,每一列可以是不同的值类型(数组/字符串/布尔值等),它可以被视为一个共享相同索引的Series的字典。
有多种方式可以构建DataFrame,其中最常用的方式是利用包含等长度列表或Numpy数组的字典来形成DataFrame。
data={'state':['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
'year':[2000,2001,2002,2001,2002,2003],
'pop':[1.5,1.7,3.6,2.4,2.9,3.2]}
frame = pd.DataFrame(data)
print(frame)
state year pop 0 Ohio 2000 1.5 1 Ohio 2001 1.7 2 Ohio 2002 3.6 3 Nevada 2001 2.4 4 Nevada 2002 2.9 5 Nevada 2003 3.2
print(frame.head())#展示数据的前五列
state year pop 0 Ohio 2000 1.5 1 Ohio 2001 1.7 2 Ohio 2002 3.6 3 Nevada 2001 2.4 4 Nevada 2002 2.9
#指定列的顺序
print(pd.DataFrame(data, columns=['year', 'state', 'pop']))
year state pop 0 2000 Ohio 1.5 1 2001 Ohio 1.7 2 2002 Ohio 3.6 3 2001 Nevada 2.4 4 2002 Nevada 2.9 5 2003 Nevada 3.2
#如果指定的类不包含在字典当中,那么会出现缺失值
frame1 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'],
index=['one', 'two', 'three', 'four', 'five', 'six'])
print(frame1)
year state pop debt one 2000 Ohio 1.5 NaN two 2001 Ohio 1.7 NaN three 2002 Ohio 3.6 NaN four 2001 Nevada 2.4 NaN five 2002 Nevada 2.9 NaN six 2003 Nevada 3.2 NaN
print(frame1.columns)#显示数据的列索引
Index(['year', 'state', 'pop', 'debt'], dtype='object')
#也可以像字典类型通过索引取某一列的值
print(frame1['state'])
one Ohio two Ohio three Ohio four Nevada five Nevada six Nevada Name: state, dtype: object
#列的引用是可以修改的,可以将空的debt的值进行修改
frame1['debt']=16.5
print(frame1)
year state pop debt one 2000 Ohio 1.5 16.5 two 2001 Ohio 1.7 16.5 three 2002 Ohio 3.6 16.5 four 2001 Nevada 2.4 16.5 five 2002 Nevada 2.9 16.5 six 2003 Nevada 3.2 16.5
#还可以用np中的arange进行赋值
frame1['debt']=np.arange(6.)
print(frame1)
year state pop debt one 2000 Ohio 1.5 0.0 two 2001 Ohio 1.7 1.0 three 2002 Ohio 3.6 2.0 four 2001 Nevada 2.4 3.0 five 2002 Nevada 2.9 4.0 six 2003 Nevada 3.2 5.0
#还可以对DataFrame数据进行转置操作
print(frame1.T)
one two three four five six year 2000 2001 2002 2001 2002 2003 state Ohio Ohio Ohio Nevada Nevada Nevada pop 1.5 1.7 3.6 2.4 2.9 3.2 debt 0 1 2 3 4 5
pandas中的索引对象是用于存储轴标签和其他元数据的。在构造Series或DataFrame时,你所使用的任意数组或标签序列都可以在内部转换为索引对象。
obj = pd.Series(range(3), index=['a','b','c'])
index = obj.index
print(index)#索引对象是不可变的
Index(['a', 'b', 'c'], dtype='object')
labels = pd.Index(np.arange(3))
print(labels)
obj2 = pd.Series([1.5,-2.5,0], index=labels)
print(obj2)
Int64Index([0, 1, 2], dtype='int64') 0 1.5 1 -2.5 2 0.0 dtype: float64
reindex是pandas对象的重要方法,该方法用于创建一个符合新索引的新对象。
obj = pd.Series([4.5,7.2,-5.3,3.6],index=['d','b','a','c'])
print(obj)
d 4.5 b 7.2 a -5.3 c 3.6 dtype: float64
obj2 = obj.reindex(['a','b','c','d','e'])#如果原本索引值不存在会引入缺失值
print(obj2)
a -5.3 b 7.2 c 3.6 d 4.5 e NaN dtype: float64
对于一些顺序数据,比如时间序列,在重建索引时可能需要进行插值或填值,我们可以使用ffill
方法进行插值,该方法会将上面的值传递到下面
obj3 = pd.Series(['blue', 'purple', 'yellow'], index=[0,2,4])
print(obj3)
0 blue 2 purple 4 yellow dtype: object
obj4 = obj3.reindex(range(6), method='ffill')
print(obj4)
0 blue 1 blue 2 purple 3 purple 4 yellow 5 yellow dtype: object
df1 = pd.DataFrame({'A':[1,2,3]}, index=[1,2,3])
df2 = pd.DataFrame({'A':[1,2,3]}, index=[3,1,2])
print(df1)
print(df2)
A 1 1 2 2 3 3 A 3 1 1 2 2 3
print(df1-df2)
A 1 -1 2 -1 3 2