OK,继续学习pandas的基本功能之计算与统计,pandas库的数据结构几乎与excel或数据库的结构完全一样,非常接近我们日常所用的数据形式。同时也是数据分析/挖掘计算的常用基础库,其计算功能的重要性自然不言而喻。
本次我们针对pandas的主要数据结构Series/DataFrame的计算统计功能和方式进行学习,主要包括算术的数据对齐、错误值填充、DataFrame和Series运算、统计方法等。
算术的数据对齐、错误值填充
算术,自然指的是加、减、乘、除,对应的方法为add、sub、mul、div,当然也可以直接进行算术运算比如pd1+pd2,pd1/pd2等等。pandas算法方法的使用方式为pd1.add(pd2)
pandas对象在进行算术运算时会自动对齐索引,即index和columns,相同索引位置的数据才会进行计算。若找不到对应的索引则会产生一个NaN。若不想出现NaN则指定一个错误值填充,即fill_value,当对应索引值不存在时用fill_value的值代替进行计算,在上节重索引部分也提到了这个错误值填充。
frame2=DataFrame(np.arange(12).reshape(4,3),index=list('abcd'))
frame2
Out[181]:
0 1 2
a 0 1 2
b 3 4 5
c 6 7 8
d 9 10 11
frame+frame2
Out[182]:
0 1 2
a 0.0 2.0 4.0
b 6.0 8.0 10.0
c 12.0 14.0 16.0
d NaN NaN NaN
frame.add(frame2,fill_value=10)
Out[185]:
0 1 2
a 0.0 2.0 4.0
b 6.0 8.0 10.0
c 12.0 14.0 16.0
d 19.0 20.0 21.0
DataFrame和Series之间的运算
Series为一列数据结构,DataFrame为两列以上数据结构,我们可以看做为一维数组,和二维数组,那么二者之间的计算方式与一维和二维数据之间必然是通用的,比如广播。当然pandas的数据有索引,故其计算方式在 默认情况下都会根据索引进行广播,通常是Series.index与DataFrame.columns相匹配进行计算,依次向下进行广播。
frame
Out[206]:
0 1 2
a 0 1 2
b 3 4 5
c 6 7 8
obj
Out[207]:
a 4.5
b 7.2
c -5.3
d 3.6
dtype: float64
frame+obj
Out[208]:
0 1 2 a b c d
a NaN NaN NaN NaN NaN NaN NaN
b NaN NaN NaN NaN NaN NaN NaN
c NaN NaN NaN NaN NaN NaN NaN
obj.index=[1,2,3,4]
frame+obj
Out[210]:
0 1 2 3 4
a NaN 5.5 9.2 NaN NaN
b NaN 8.5 12.2 NaN NaN
c NaN 11.5 15.2 NaN NaN
如果希望Series.index与DataFram.index想匹配,依次按照列向右广播,那么需要指定axis=0即轴,同时就需要依靠上面所提到的加减乘除方法,即add、sub。。。
obj.index=list('abcd')
obj
Out[212]:
a 4.5
b 7.2
c -5.3
d 3.6
dtype: float64
frame.add(obj,axis=0)
Out[213]:
0 1 2
a 4.5 5.5 6.5
b 10.2 11.2 12.2
c 0.7 1.7 2.7
d NaN NaN NaN
统计描述
基本的统计描述,即求和、求平均、统计数量、计算最大值、最小值等等,pandas默认统计方法的对象力度是columns,而不是index,若想要实现index粒度,则需要指定axis=1。
describe方法常用来查看数据的基本信息,如数据总量、平均值、最小值、25%中位数等等,针对非数值类型的数据,其统计描述的方法为count、unique、top、freq。
pandas常用的统计方法如下:
附:argmin/argmax方法为Sereis的方法,在未来版本中将会被idxmin、idxmax代替。
obj=Series(np.arange(10))
frame=DataFrame(np.arange(12).reshape(4,3),index=list('abcd'))
obj.sum()
Out[7]: 45
frame.sum()
Out[9]:
0 18
1 22
2 26
dtype: int64
frame.sum(axis=1)
Out[10]:
a 3
b 12
c 21
d 30
dtype: int64
obj3=Series(list('aadc'))
obj3.describe()
Out[23]:
count 4
unique 3
top a
freq 2
dtype: object
除了以上几点外,pandas还提供了唯一值、值计数、以及成员资格等方法。
唯一值:unique方法,可以得到Series中的唯一值元素数组,按元素顺序返回,DataFrame无此方法
值计数:value_counts方法,可以统计Sereis中元素出现的次数,其结果索引为元素的唯一值,其值是元素的频率,此方式也可用于数组或列表,DataFrame无此方法。
成员资格:isin方法,用来判断元素是否在数据中,返回的对象为一组布尔值,适用于Sereis和DataFrame
apply:此方法针对于DataFrame,类似于map函数的用法,即将一个方法应用于DataFrame内的元素,可通知axis来指定行或者列
obj
Out[68]:
a 1
b 1
c 2
d 3
e 4
f 5
dtype: int32
obj.unique()
Out[55]: array([1, 2, 3, 4, 5], dtype=int64)
obj.isin([1,2])
Out[69]:
a True
b True
c True
d False
e False
f False
dtype: bool
f=lambda x:x.max()-x.min()
frame.apply(f)
Out[83]:
1 4
2 8
3 8
4 8
dtype: int64