python基础库之Pandas

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dingming001/article/details/82561401
运行环境:win10 64位 py 2.7 pycharm 2018.1.1
#!/usr/bin/python
#  -*- coding:utf-8 -*-
from pandas import Series,DataFrame
import pandas as pd
import numpy as np

#pandas 的数据结构介绍
#要使用pandas,首先要熟悉他的两个主要的数据结构:Series和DataFrame。
#Series 是一种类似于一维数组的对象,由一组数据(各种numpy数据类型)以及一组与之相关的数据标签(即索引)组成。
#仅由一组数据即可产生最简单的Series:
obj = Series([4, 7, -5, 3])
print(obj)
#serice 的字符串表现形式为:索引在左边,值在右边。
#由于我们没有为数据指定索引,于是会自动创建一个0到N-1(N位数据的长度)的整数的索引。
#可以通过series的values和index属性获取其数组表现形式和索引对象。
print obj.values
print obj.index
#通常我们希望所创建的Series带有一个可以对各个数据点进行标记的索引:
obj2 = Series([4, 7, -5, 3],index=['d','b','a','c'])
print obj2['a']
#可以通过索引改变值
obj2['a']=10
print obj2
#NumPy数组运算(若根据布尔型数组进行过滤,标量乘法,应用数学函数等)都会保留索引和值之间的链接:
print obj2[obj2>0]
print np.exp(obj2)
#我们也可以将Serice看成一个定长的有序字典,因为它是索引值到数据值的一个映射。可以用在许多原本需要字典参数的函数中:
print 'b' in obj2
#如果数据被存放在一个python字典中,可以直接通过这个字典来创建Series
sdata={'Ohio':35000,'Texas':71000,'Oregon':16000,'Utah':5000}
obj3 = Series(sdata)
print obj3
#只传入一个字典,则结果Series中索引就是原字典的键(有序排列)
states=['California','Ohio','Oregon','Texas']
obj4=Series(sdata,index=states)
print obj4
# pandas的isnull和notnull函数可以用于检测缺失数据:
print pd.isnull(obj4)
print pd.notnull(obj4)
#Series重要的一个功能是:它在算术中会自动对齐不同索引的数据。
print obj3+obj4
# Series对象本身及其索引都有一个name属性,该属性跟pandas其他关键功能关系非常密切:
obj4.name='population'
obj4.index.name='state'
print obj4
#  DataFrame
# DataFrame是一个表格型的数据结构,含有一组有序的列,每列可以是不同的值类型(数值,字符串,布尔值等)
# DataFrame既有行索引也有列索引,可以被看做是由Series组成的字典。
# 跟其他的类似的数据结构相比(如R的data.frame),DataFrame中面向行和列的操作基本是平衡的。
#
# DataFrame中的数据是以一个或多个二维块存放的。
#
# 构建DataFrame的办法有很多,最常用的一种是直接传入一个由等长列表或numpy组成的数组组成的字典:
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'], 'year': [2000, 2001, 2002, 2001, 2002],
        'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
frame=DataFrame(data)
print frame
# 指定列序列,DataFrame的列就会按照指定顺序进行排列:
frame2 = DataFrame(data,columns=['year','state','pop'])
print frame2
# 跟Series一样,如果传入的列在数据中找不到,就会产生NA值:
frame3=DataFrame(data,columns=['year','state','pop','debt'],index=['one','two','three','four','five'])
print frame3
print frame3.columns
#通过类似于字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series:
print frame3['state']
print frame3.year
# 返回的Series拥有原DataFrame相同的索引,且其name属性也已经被相应的设置好了。
# 行也可以通过位置或名称的方式来进行获取。查找行的数据
frame3.ix['three']
#列可以通过赋值的方式进行修改。如下,我们可以给空的”debt“列赋值一个标量或一组值。
frame3['debt']=16.5
print frame3
# 将列表或数组赋值给某个列的时候,其长度必须要跟DataFrame的长度向匹配。如果赋值的是一个个Series ,就会精确的匹配DataFrame的索引,所有的空位都将被填上的缺失值。
val=Series([-1.2,-1.5,-1.7],index=['two','four','five'])
frame3['debt']=val
print frame3
#为不存在的列赋值会创建一个新列。关键字del用于删除列:
frame3['eastern']=frame3.state=='Ohio'
print frame3
#删除行
del frame3['eastern']
print frame3.columns
#另一种常见的数据形式是嵌套字典(也就是字典的字典):
pop={'Nevada':{2001:2.4,2002:2.9},'Ohio':{2000:1.5,2001:1.7,2002:3.6}}
frame4=DataFrame(pop)
print frame4
# 也可以对结果进行转置:
print frame4.T
# 内层字典的键会被合并、排序以及形成最终的索引。若指定了显式索引,则不会这样:
frame5=DataFrame(pop,index=[2001,2002,2003])
print frame5
# 由Series组成的字典差不多也是一样的用法:
pdata={'Ohio':frame4['Ohio'][:-1],'Nevada':frame4['Nevada'][:2]}
print DataFrame(pdata)
# 如果设置了Data.Frame的index属性和columns的name属性
frame4.index.name='year'
frame4.columns.name='state'
print frame4
print frame4.values
#索引对象
# pandas的索引对象负责管理标签和其他元数据(比如轴名称等)。构建Series或DataFrame时,所用到的任何数组或其他序列的标签都会被转换成一个Index:
obj=Series(range(3),index=['a','b','c'])
print obj
index=obj.index
print index
#取0,1,2
print index[0:]
#取0,1(从0到倒数1)
print index[:-1]
# 取倒数第一
print index[-1:]
# ndex对象是不可修改的,因此用户不能对其修改:
# print index[1]='d'
# 不可修改性非常重要,因为这样才能使得index对象在多个数据结构之间安全共享:
index=pd.Index(np.arange(3))
obj2=Series([1.5,-2.5,0],index=index)
print obj2.index is index
# 除了长得像数组,index的功能也类似一个固定大小的集合:
print frame4
print 'Ohio' in frame4.columns
print 2003 in frame3.index

# 基本功能
# 介绍操作Series和DataFrame中的数据的基本手段。
obj=Series([4.5,7.2,-5.3,3.6],index=['d','b','a','c'])
# 调用该Series的reindex将会根据新索引进行重排。如果某个索引值当前不存,就引入缺失值:
obj2=obj.reindex(['a','b','c','d','e'])
print obj2
obj.reindex(['a','b','c','d','e'],fill_value=0)
# 对于时间序列这样的有序数据,重新索引时可能需要做一些插值处理。method选项即可用达到此目的。例如:ffill可以实现向前值填充:
# fill或pad 前向填充(或搬运)值
# bfill或backfill 后向填充(或搬运)值
# obj3=Series(['blue','purple','yellow'],index=[0,2,4])
# obj3.reindex(range(6))
# print obj3
# obj3.reindex(range(6),method='ffill')
# print obj3
obj3=Series(['blue','purple','yellow'],index=[0,2,4])
obj3=obj3.reindex(range(6))
print obj3
#对于DataFrame,reindex可以修改(行)索引,列,或两个都修改。如果仅传入一个序列,则会重新索引行:
frame=DataFrame(np.arange(9).reshape((3,3)),index=['a','c','d'],columns=['Ohio','Texas','California',])
print frame
frame2=frame.reindex(['a','b','c','d'])
print frame2
#使用columns关键字即可以重新索引。
states=['Texas','Utah','California']
frame = frame.reindex(columns=states)
print frame
# 也可以同时对行和列进行重新索引,而插值则只能按行应用(即轴0):
frame = frame.reindex(index=['a','b','c','d'],method='ffill',columns=states)
print frame
#利用ix的标签的=索引功能,重新索引任务可以变得简洁:
frame = frame.ix[['a','b','c','d'],states]
print frame
#丢弃指定轴上的项
# 丢弃某条轴上的一个或多个项,只要有一个索引数组或列表即可。
# 由于需要执行一些数据整理和集合逻辑,所以drop方法返回的是一个在指定轴上删除了指定值的新对象:
obj=Series(np.arange(5.),index=['a','b','c','d','e'])
new_obj=obj.drop('c',axis=0)
print new_obj
# 对于DataFrame,可以删除任意轴上的索引值:
data=DataFrame(np.arange(16).reshape((4,4)),index=['Ohio','Colorado','Utah','New York'],columns=['one','two','three','four'])
data1 = data.drop(['Colorado','Ohio'])
print data1
#此处必需指定是那个轴two在列轴上0是行轴,1是列轴
data2 = data.drop('two',axis=1)
print data2
#删除两列
data3 = data.drop(['two','four'],axis=1)
print data3
#索引、选取和过滤
# Series索引 (obj[...])的工作方式类似于NumPy数组的索引,只不过Series的索引值不只是整数。
obj=Series(np.arange(4.),index=['a','b','c','d'])
print obj
print obj['b']
print obj[1]
print obj[2:4]
print obj[['b','a','d']]
print obj[[1,3]]
print obj[obj<2]
# 利用标签的切片运算与普通的python切片运算不同,其末端是包含的(inclusive)
print obj['b':'c']
obj['b':'c']=5
print obj
# 对DataFrame进行索引其实就是获取一个或多个列
data=DataFrame(np.arange(16).reshape((4,4)),index=['Ohio','Colorado','Utah','New York'],columns=['one','two','three','four'])
print data[:2]
print data[data['three']>5]
# 另一种用法使通过布尔型DataFrame进行索引:
print data<5
# 不可写成data = data[data<5]=0
data[data<5]=0
print data
# 为了在DataFrame的行上进行标签索引,我们引入专门的索引字段ix。使得你通过numpy式的标记法以及轴标签的从DataFrame中选取行和列的子集。这是重现索引的简单手段:
print data.ix['Colorado',['two','three']]
print data.ix[['Colorado','Utah'],[3,0,1]]
print data.ix[2]
print data.ix[data.three>5,:3]
# 算术运算和数据对齐
s1=Series([7.3,-2.5,3.4,1.5],index=['a','c','d','e'])
s2=Series([-2.1,3.6,-1.5,4,3.1],index=['a','c','e','f','g'])
print s1+s2

猜你喜欢

转载自blog.csdn.net/dingming001/article/details/82561401