Pandas数据结构介绍
Pandas数据结构介绍
Series
-
声明对象
Series是带索引功能的一维数组,其对象包含value和index基本属性
s=pd.Series([1,2,3],index=['a','b','c'])
s.index #['a','b','c']
s.value #[1,2,3] -
取元素
s[索引] # s[['b','c']] -
用Numpy数组或其他Series对象定义新的Series对象
a=np.arrat([1,2,3])
s1=pd.Series(a)
s2=pd.Series(s)
这样生成的新对象并不是副本而是原对象的引用 -
筛选元素
因为pandas是以Numpy为基础的,所以可以直接用Numpy中的一些办法
s[s>5] -
运算
运算的原理也与numpy相通
np.log(s) -
Series对象的组成元素
unique()函数用来取出对象中不重复出现的元素
vlaues_count()函数用来统计每个值的个数
isin([值])返回是否在其中,布尔型 -
NaN处理
s[s.isnull()]输出空值
s[s.notnull()]输出非空值 -
Series与字典
mydict={'red':1,'green':2,'yellow':3}
s5=pd.Series(mydict)
字典的索引自动变为Series的索引 -
Series对象之间的运算
s1+s2只会进行索引值相同部分的相加生成新的Series对象,两者独有的索引值会也会存在,运算后对应的值为NaN
DataFrame
DataFrame对象就是一张强行带上索引列的二维表,出去index的那一列其余的列名保存在column属性中。
定义对象
- 传入字典
dict={'color':['red','green','yellow'],'name':['ball','pen','pencil'],'price':[1,1,2,1,2]}
frame=pd.DataFrame(dict)
这样index列会默认设置为0,1,2,3.。。
frame=pd.DataFrame(dict,index=['','',''])等 - DataFrame(数据,index,column)
frame=pd.DataFram(np.random.random(16).reshape((4,4)),index=[],columns=[])
选取元素
按列选取:frame['color']与fram.color的效果是一样的,返回的是Series对象
按行选取:frame.ix[行的索引值] frame.ix[2]
也可以:
frame[0:1]选取第0行
frame[1:3]选取第1,2行
最后,如果获取存储在DataFrame中的一个元素,需要依次指定元素所在的列的名称、行的索引值或标签 frame['name'][3]
赋值
按照取值的逻辑自然就可以赋值、增加的新的行和列
fram['new']=[...] 插入某列
fram['new'][0]=
fram['new']=Series
疑问?DataFrame插入某行怎么办?
元素所属关系
frame[frame.isin([1.0,'pen'])]
转置
DataFrame的转置很简单直接 Fram.T即可实现
删除一列
del fram['new']
筛选
frame[frame<12] 符合条件的会被留下且位置不变。不符合条件的变成NaN
嵌套字典生成DataFrame
mydict={'red':['l1':1,'l2':2,'l3':3],'yellow':['l1':4,'l2':5,'l3':6],'green':['l1':7,'l2':8,'l3':9]}
第一层嵌套是列,里面重复嵌套行。
删除某行某列
frame.drop([index1,index2...]) 删除行
frame.drip([column1,column2....],axis=1) 删除列
数据结构之间的运算
就是Series和DataFrame之间的运算
除了用运算符,以下函数也是可以的
- add()
- sub()
- div()
- mul()
比如 frame1+frame2与 frame1.add(frame2)的效果是一样的
Series和DataFrame之间的运算就有些复杂了,简而言之,两者运算靠共同的索引,不同的索引会造成打量的NaN
可以看到Frame中的列索引与Ser想同的部分都做了相减。如果索引值没有想同的就会
产生NaN
函数与映射
按行或列执行操作的函数
f=lambda x: x.max()-x.min()
frame.apply(f)按列执行
frame.apply(f,axis=1) 按行执行
统计函数
frame.sum() fram.mean() 等依然可以按照列进行相关统计量的计算
frame.describe() 将会列出所有描述性统计量
排序
sort_index() 可以对Series和DataFrame的索引进行排序
sort_index(axis=1) 可以对DataFrame的横轴进行排序
值排序
ser.order() 默认升序 改变:ser.order(ascending=False)
对frame 需要制定按照哪一列:
frame.sort_index(by='price')
NaN的处理
过滤NaN
- ser.dropna() 但fram.dropna()会删除NaN存在的整个行和列
fram.dropna(how='all')删除行或列整个都是NaN的情况 - 也可以索引过滤: ser[ser.notnull()]
为NaN填充其他值
- fram.fillna(值)
- 不同的列填充不同:fram.fillna({'price':1,'color':null,'name':null})
最后说一下,Series是可以层级的形式出现的。Series和DataFrame之间可以用stack(), unstack()函数互相转换