pandas包含的数据结构和数据处理工具是设计,使得在python中的进行数据清洗和分析非常快捷。pandas经常和其他数值计算工具,比如numpy scipy,以及数据可视化工具 matplotlib一起使用。
尽管pandas采用了很多 numpy 的代码风格,但是pandas是用来处理表格型或异质性数据的。numpy 更适合同质型的数值类数组数据。
为了入门pandas,需要熟悉两个常用的的工具数据结构: Series 和 DataFrame。这为大多数的应用提供了一个有效易用的基础。
Series
这是一种一维的数组型对象,包含了一个值序列(与numpy 中的类型类似),并且包含了数组标签,称为索引。最简单的序列具有仅仅有一个数组组成:
obj=pd.Series([1,2,3,4,5])
obj
0 1
1 2
2 3
3 4
4 5
dtype: int64
print(obj.values,obj.index)
[1 2 3 4 5] RangeIndex(start=0, stop=5, step=1)
obj2=pd.Series([1,2,3,4],index=['a','b','c','d']) # 通常需要创建一个索引序列,用标签标识每个数据带你
obj2.index
Index(['a', 'b', 'c', 'd'], dtype='object')
obj2[['c','b']] # 使用标签来进行索引,
c 3
b 2
dtype: int64
使用 numy 的函数,或者是布尔值数组来过滤,与标量的运算,应用数学函数等,都会保留索引值链接,series 可以看作一个长度固定且有序的字典,索引值与数据值配对,'b' in obj2 >>> True
np.exp(obj2)
a 2.718282
b 7.389056
c 20.085537
d 54.598150
dtype: float64
data={'Ohio':35000,'texas':71000,'oregon':16000}
obj3=pd.Series(data) # 可以使用字典生成一个 Series.
obj3
Ohio 35000
texas 71000
oregon 16000
dtype: int64
state = ['california','texas','Ohio'] # 自定键的顺序传递给构造函数
obj4=pd.Series(data,state)
california NaN # 没有匹配值就是NaN
texas 71000.0
Ohio 35000.0
dtype: float64
NaN 是pandas中标记缺失值或NA 值的方式,表示缺失数据。pandas中使用isnull 和 notnull 函数来检擦缺失数据。
pd.isnull(obj4) # obj4.isnull() 也一样。
california True
texas False
Ohio False
dtype: bool
serise 对象自身何其索引都有name属性,这个特性和pandas 其他重要功能集合在一起:
obj4.name='我是对象'
obj4.index.name='我是索引'
obj4
我是索引
california NaN
texas 71000.0
Ohio 35000.0
Name: 我是对象, dtype: float64
obj4.index=[1,2,3] # 通过按位置赋值的方式改变索引,,name属性自然也改变
obj4
1 NaN
2 71000.0
3 35000.0
Name: 我是对象, dtype: float64
DataFrame
表示矩阵的数据表,包含已排序的列集合,每一列可以是不同的值类型(整形,浮点型,布尔值)。dataframe 既有行索引,又有列索引,可以视为一个共享相同索引的 series 的字典。在 dataframe 中,数据被存储为一个以上的二维块,而不是列表,字典或其他一位数组的集合。
有多种方式构建 dataframe ,最常用的方式是利用包含等长度列表或numpy 数组的字典来形成dataframe 。
data={
'state':['ohio','ohio','ohio','nevada','nevada','nevada'],
'year':[2000,2001,2002,2001,2002,2003],
'pip':[1.5,1.7,3.6,2.4,2.9,3.2]
}
frame=pd.DataFrame(data,columns=['year','state','pip']) # 将列按这个顺序排列
frame # 产生的 dataframe 会自动为sereies 分配索引,并且会按照排序的顺序排列
year state pip
0 2000 ohio 1.5
1 2001 ohio 1.7
2 2002 ohio 3.6
3 2001 nevada 2.4
4 2002 nevada 2.9
5 2003 nevada 3.2 # 对于大型dataframe frame.head()方法只会选出头部的五行,
frame.colums
Index(['year', 'state', 'pip'], dtype='object')
frame['state'] # 可以按字典型标记或属性那样检索series。等价于 frame.state
0 ohio
1 ohio
2 ohio
3 nevada
4 nevada
5 nevada
Name: state, dtype: objec # frame[colunm]对任意列名都有效,但是frame.column 只在列名是有效的python变量时才有效
frame=pd.DataFrame(data,columns=['year','state','pip','debt'])
year state pip debt # 当传入的列不在字典中,结果就是缺失值。
0 2000 ohio 1.5 NaN
1 2001 ohio 1.7 NaN
2 2002 ohio 3.6 NaN
3 2001 nevada 2.4 NaN
4 2002 nevada 2.9 NaN
5 2003 nevada 3.2 NaN
# 列的引用是可以修改的,例如,这个空的 debt 列可以赋值为标量值,或者值数组
# 从 dataframe 中选取的列时数据的视图,对 series 的修改会映射到数据表中,如果需要复制,使用 series 的copy 方法
frame['debt']=16.5
frame
year state pip debt
0 2000 ohio 1.5 16.5
1 2001 ohio 1.7 16.5
2 2002 ohio 3.6 16.5
3 2001 nevada 2.4 16.5
4 2002 nevada 2.9 16.5
5 2003 nevada 3.2 16.5
frame['debt']=np,arange(6) # 当讲列表或数组赋值给了一个列时,值得长度必须和dataframe 的长度匹配。
# 如果你将series 赋值给一列时,series 的索引将会按照dataframe 的索引重新排列,并在空缺的部分填充缺失值。
val = pd.Series([1.2,1.5,1.7],index=[0,1,9])
frame['debt'] = val
year state pip debt # 索引有不匹配的就舍弃了。
0 2000 ohio 1.5 1.2
1 2001 ohio 1.7 1.5
2 2002 ohio 3.6 NaN
3 2001 nevada 2.4 NaN
4 2002 nevada 2.9 NaN
5 2003 nevada 3.2 NaN
frame['eastern'] = frame.state=='ohio' # 添加一行布尔值类型的
frame # frame.eastern 无法创建新的列,因为没有这个变量
year state pip debt eastern
0 2000 ohio 1.5 1.2 True
1 2001 ohio 1.7 1.5 True
2 2002 ohio 3.6 NaN True
3 2001 nevada 2.4 NaN False
4 2002 nevada 2.9 NaN False
5 2003 nevada 3.2 NaN False
del frame['eastern'] # 移除列
year state pip debt
0 2000 ohio 1.5 1.2
1 2001 ohio 1.7 1.5
2 2002 ohio 3.6 NaN
3 2001 nevada 2.4 NaN
4 2002 nevada 2.9 NaN
5 2003 nevada 3.2 NaN
。。。有点长。。。别看烦了。。。
另一种常用的数据形式时包含字典的嵌套字典。
pop={'nevade':{2001:2.4,2002:2.9},
'ohio':{2000:1.5,2001:1.7,2002:3.6}}
frame=pd.DataFrame(pop)
frame
nevade ohio
2001 2.4 1.7
2002 2.9 3.6
2000 NaN 1.5
frame.T # 类似numpy 的语法进行转置。
2001 2002 2000
nevade 2.4 2.9 NaN
ohio 1.7 3.6 1.5
frame=pd.DataFrame(pop,index=[2000,2002,2003]) # 内部字典的键被联合,如果显示的指名索引,内部字典的键将不会被排序
frame
nevade ohio
2000 NaN 1.5
2002 2.9 3.6
2003 NaN NaN
pdata={'ohio':frame['ohio'][:], # 包含serise 的字典也可以用于构造dataframe。构造函数的有效输入可以去看看下面那个表
'nevade':frame['nevade'][:2]} # 索引以大的来
pd.DataFrame(pdata)
ohio nevade
2000 1.5 NaN
2001 1.7 2.4
2002 3.6 2.9
frame.index.name='year' # 有name属性的也会显示
frame.columns.name='state'
frame
state nevade ohio
year
2001 2.4 1.7
2002 2.9 3.6
2000 NaN 1.5
# dataframe 的 values 属性将包含在dataframe 中的数据以二维 ndarray 的形式返回
frame.values
array([[2.4, 1.7],
[2.9, 3.6],
[nan, 1.5]])
# dataframe 的列时不同的 dtype ,则values 的 dtype 会自动选择合适所有列的类型,比如object 什么的
哎。。。。写的我自己都不愿意在看一次了,,,,,,