本篇文章主要借鉴《利用Python进行数据分析》一书,文中很多例子是博主自己举例,基本都没有给出答案,有想要学习的同学可以自己把代码敲出来然后运行,查看结果,实践是编程学习的第一步啦~
一、背景
1.pandas包含的数据结构和数据处理共计使得在python中进行数据清洗和分析非常快捷,经常与其他数值计算工具比如numpy、scipy,以及数据可视化工具如matplotlib一起使用。
2.numpy处理的是同质型数值类数组数据,而pandas处理的是表格型或异质型数据。
3.导入pandas:import pandas as pd。导入常用的类:from pandas import DataFrame,Series
二、pandas常用两个数据结构:Series、DataFrame
1.Series:是一维的数组型对象,包含了值序列和索引。当不指定索引时,默认生成的索引是从0到N-1。可以通过声明变量.index和.values来查看索引和值。
obj=pd.Series([4,-3,2,1])
obj.index
obj.values
或者可以直接在声明变量的时候加上自定义的索引:
obj=pd.Series([4,-3,2,1],index=['a','b','e','d'])
如果需要获取其中的数据,有类似数组索引的操作,既可以按索引值索引,又可以按位置索引:obj['e']或者obj[2] ,得到的结果都是2。如果要获取多个值,一定要在索引外套上中括号:obj[['e','a','b']]或obj[[2,0,1]]
2.可以对Series对象进行数学函数和布尔型的操作:
obj[obj>0]
obj*2
np.exp(obj)
3.其实Series类似于长度固定且有序的字典。
查询值或索引是否在Series中,可以类似于字典用in关键字:'a' in obj,返回布尔值。也可以直接从字典生成Series:
sdata={'a':'one','b':'two','c':'three'}
obj3=pd.Series(sdata)
4.Series对象自身和其索引都有name属性,通过对name赋值达到“取名字”的作用:
obj4.name='map'
obj4.index.name='word'
5.DataFrame:表示的是矩阵的数据表,包含已排序的列集合,每一列可以是不同的值类型。DataFrame既有行索引又有列索引。
6.构建DataFrame:包含多个等长度列表的字典或者包含Numpy数组的字典
data={'city':['a','b','c','d'],
'population':[1000,1500,1200,2000],
'year':[2002,2002,2001,2005]}
frame=pd.DataFrame(data)
也可以用包含字典的嵌套字典构建:
obj={'a':{2001:3.4,2002:1},
'b':{1990:5,2001:5,2002:4.2}}
obj2=pd.DataFrame(obj)
7.可以用head方法查看前几行数据:frame.head(2)
可以指定列顺序:frame2=pd.DataFrame(data,columns=['city','year','population'])
如果传入的值不存在,则会用NaN表示缺失值
8.DataFrame检索列可以用字典的方式:frame2['city']或者frame2.city
9.列的引用可以做统一的修改处理:frame2['day']=12或者frame2.day=np.arange(4)
当把列表或者数组赋值给一列时,值的长度必须和DataFrame的长度相匹配,如果有空缺将自动填补成缺失值
val=pd.Series([-1,-2,3],index=[3,2,0])
frame2.day=val
10.del关键字可以删除指定列:del frame2['day']
11.类似于Series,DataFrame也可以给行和列取名:obj2.index.name='year';obj3.columns.name='city'
三、基本功能
1.重建索引:obj2.reindex([2000,2003,2001])
ffill方法可以插值而防止缺失值的出现,默认是向前填充:
obj3=pd.Series(['a','b','c'],index=[1,2,4])
obj3.reindex(range(6),method='ffill')
如果是第一个数确实,无法向前填充则仍然是缺失值NaN。向后填充是bfill
2.改变DataFrame的行索引和列索引:
frame=pd.DataFrame(np.arange(9).reshape(3,3),index=['a','c','d'],columns=[1,2,3])
frame2=frame.reindex(['a','b','c','d']) 改变行
frame2.reindex(columns=[1,2,3,4]) 改变列
3.轴向上删除行或列:
frame2.drop(['b','c']) 删除行
frame2.drop(2,axis=1) 删除列,注意删除列的时候要制定是1号轴
这样表示后只是提取了原结构的视图,没有进行改变
frame2.drop('b',inplace=True) 这样操作之后就会将b行清除
4.索引、选择:与Numpy索引类似,不过Numpy索引只能是整数。
obj=pd.DataFrame(np.arange(12).reshape(3,4),index=['a','b','c'],columns=[1,2,3,4])
obj['b':'c']和obj[2:4]得到的结果相同
5.使用loc和iloc从DataFrame中选取行或行的集合:obj.loc['b',[1,2]]或者obj.iloc[1,[0,1]]。注意,使用iloc的时候是完全的按位置取集合,跟索引没有关系,而loc是索引。
obj.iloc[[1,2],[0,3]],得到的是原结构的子集
6.算术:将对象相加时,如果存在某个索引对不相同,则返回索引对的并集,缺失值自动填充为NaN。或者可以使用fill_value实现缺失值的填充:
s1.sub(s2,fill_value=0),如果出现缺失值,则会默认s2中的值为0进行计算
如果加上前缀r,则计算会颠倒:s1.rsub(s2)等于s2-s1等于s2.sub(s1)
7.DataFrame和Series之间的操作遵循广播机制,默认情况下,DataFrame和Series的数学操作会将Series的索引和DataFrame的列进行匹配并广播到各行。