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()函数互相转换

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容