pandas入门
由于最近公司要求做数据分析,pandas每天必用,只能先跳过numpy的学习,先学习大Pandas库
Pandas是基于Numpy构建的,让以Numpy为中心的应用变得更加简单
pandas的数据结构介绍
-
Series
import pandas as pd
from pandas import Series,DataFrame
obj = Series([4,7,-5,3])
# 索引在左边,值在右边,默认从0开始
obj
0 4
1 7
2 -5
3 3
dtype: int64
# 制定索引
obj2 = Series([4,7,-5,3],index = ['a','b','c','d'])
obj2
a 4
b 7
c -5
d 3
dtype: int64
# 查看索引
obj2.index
Index(['a', 'b', 'c', 'd'], dtype='object')
# 查询
obj2[['a','b','c']]
a 4
b 7
c -5
dtype: int64
obj2[obj2>0]
a 4
b 7
d 3
dtype: int64
sdata = {'ke':35000,'text':70000,'orgen':16000}
obj3 = Series(sdata)
obj3
ke 35000
text 70000
orgen 16000
dtype: int64
keys = ['ke','text','orgen','xu']
obj4 = Series(sdata, index=keys)
obj4
ke 35000.0
text 70000.0
orgen 16000.0
xu NaN
dtype: float64
- 检测缺失值的重要两个函数 isnull和notnull
obj4[obj4.isnull()]
xu NaN
dtype: float64
obj4[obj4.notnull()]
ke 35000.0
text 70000.0
orgen 16000.0
dtype: float64
# 可以理解成对象名称
obj4.name = 'pop'
# 对象的索引的名称
obj4.index.name = 'state'
obj4
state
ke 35000.0
text 70000.0
orgen 16000.0
xu NaN
Name: pop, dtype: float64
# Series的索引可以就地修改
obj4.index = ['new_ke','new_text','new_orgen','new_xu']
new_ke 35000.0
new_text 70000.0
new_orgen 16000.0
new_xu NaN
Name: pop, dtype: float64
-
DataFrame
- DataFrame是一个表格型数据结构,最常用的是直接传入一个由等长列表或者是Numpy数组组成的字典
data = {'state':['oh','oh','vad','vad'],
'yead':[2000,2001,2002,2003],
'pop':[1.5,1.7,3.6,2.4]
}
frame = DataFrame(data)
# 自动有序排列
yead state pop
0 2000 oh 1.5
1 2001 oh 1.7
2 2002 vad 3.6
3 2003 vad 2.4
# 如果传入的列在数据中找不到,就产生NaN
DataFrame(data,columns=['yar','yead'])
yar yead
0 NaN 2000
1 NaN 2001
2 NaN 2002
3 NaN 2003
通过类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series
data = {'state':['oh','oh','vad','vad'],
'years':[2000,2001,2002,2003],
'pop':[1.5,1.7,3.6,2.4]
}
frame2 = pd.DataFrame(data,columns=['years','state','pop'])
# 原地修改索引
frame2.index=['one','two','three','four']
frame2
years state pop
one 2000 oh 1.5
two 2001 oh 1.7
three 2002 vad 3.6
four 2003 vad 2.4
frame2.columns
Index(['years', 'state', 'pop'], dtype='object')
# 通过类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series
# 字典操作
series_=frame2['state']
series_
one oh
two oh
three vad
four vad
Name: state, dtype: object
# 对象操作
frame2.years
one 2000
two 2001
three 2002
four 2003
Name: years, dtype: int64
# 查看具体一行的数据
frame2.ix['three']
years 2002
state vad
pop 3.6
Name: three, dtype: object
# 修改具体一列的数
frame2['new_raw']=16.5
frame2
years state pop new_raw
one 2000 oh 1.5 16.5
two 2001 oh 1.7 16.5
three 2002 vad 3.6 16.5
four 2003 vad 2.4 16.5
将列表或数组赋值给某个列时,其长度必须跟DataFrame的长度相匹配,否则自动填充空值
from pandas import Series
val = Series([-1.2,-1.5,-1.7], index=['two','four','five'])
frame2['new_raw'] = val
frame2
years state pop new_raw
one 2000 oh 1.5 NaN
two 2001 oh 1.7 -1.2
three 2002 vad 3.6 NaN
four 2003 vad 2.4 -1.5
删除列
# 为不存在的列赋值
frame2['eastern'] = frame2.state == 'oooo'
frame2
years state pop new_raw eastern
one 2000 oh 1.5 NaN False
two 2001 oh 1.7 -1.2 False
three 2002 vad 3.6 NaN False
four 2003 vad 2.4 -1.5 False
del frame2['eastern']
frame2.columns
Index(['years', 'state', 'pop', 'new_raw'], dtype='object')
警告:通过索引方式返回的列只是相应数据的视图而已,并不是副本,对返回的Series所做的任何就地修改都会反映到源数据上,可以通过Series的copy方法显示的复制列
嵌套字典 外层字典的键作为列,内层键作为行索引
pop = {'Nevada':{2001:2.4,2002:2.9},
'Ohio':{2000:1.5,2001:1.7,2002:3.6}
}
frame3=pd.DataFrame(pop)
frame3
Nevada Ohio
2000 NaN 1.5
2001 2.4 1.7
2002 2.9 3.6
转置
frame3.T
2000 2001 2002
Nevada NaN 2.4 2.9
Ohio 1.5 1.7 3.6
# 内层字典的键会被合并、排序以形成最终的索引,如果显示指定了索引,就不会这样
frame3.reindex(index=[2001,2002,2000])
Nevada Ohio
2001 2.4 1.7
2002 2.9 3.6
2000 NaN 1.5
DataFrame构造函数所能接受的各种数据
类型 |
说明 |
二维ndarry |
数据矩阵 |
由数组、列表或元组组成的字典 |
每个序列变成DataFrame的一列。所有序列的长度必须相同 |
Numpy结构化/记录数组 |
类似于由数组组成的字典 |
由Series组成的子典 |
每个Series会成为一列 |
由字典组成的字典 |
各内层字典会成为一列 |
字典或Series的列表 |
各项将会成为DataFrame的一行。 |
由列表或元组组成的列表 |
类似于'二维ndarray' |
另一个DataFrame |
该DataFrame的索引将会被沿用,除非显示指定了其他索引 |
Numpy的maskedArray |
类似于'二维ndarray'的情况 |
如果设置了DataFrame的index和columns的name属性,则这些信息也会被显示出来
frame3.index.name='year'
frame3.columns.name = 'state'
frame3
state Nevada Ohio
year
2000 NaN 1.5
2001 2.4 1.7
2002 2.9 3.6
values属性返回一个二维ndarray的形式
frame3.values
array([[nan, 1.5],
[2.4, 1.7],
[2.9, 3.6]])
如果各列的数据类型不同,则会选用能兼容所有列的数据类型
frame2.values
array([[2000, 'oh', 1.5, nan],
[2001, 'oh', 1.7, -1.2],
[2002, 'vad', 3.6, nan],
[2003, 'vad', 2.4, -1.5]], dtype=object)
索引对象
pandas的索引对象负责管理轴标签和其他元数据比如轴名称等,构建Series或DataFrame时,所用到的任何数组或其他序列的标签都会被转换成一个Index
obj = Series(range(3), index=['a','b','c'])
obj.index
Index(['a', 'b', 'c'], dtype='object')
obj.index[:1]
Index(['a'], dtype='object')
index对象是不可修改的,这样子才能index对象在多个数据结构之间安全共享
obj.index[0] = '5'
TypeError Traceback (most recent call last)
<ipython-input-24-61511960448d> in <module>()
----> 1 obj.index[0] = '5'
E:anaconda3libsite-packagespandascoreindexesase.py in __setitem__(self, key, value)
2063
2064 def __setitem__(self, key, value):
-> 2065 raise TypeError("Index does not support mutable operations")
2066
2067 def __getitem__(self, key):
TypeError: Index does not support mutable operations
index的继承
import numpy as np
index = pd.Index(np.arange(3))
index
Int64Index([0, 1, 2], dtype='int64')
obj2 = Series([1.5,-2.5,0], index = index)
obj2
0 1.5
1 -2.5
2 0.0
dtype: float64
obj2.index is index
True
pandas中主要的Index对象
类 |
说明 |
Index |
将轴标签表示为一个由Python对象组成的Numpy数组 |
Int64Index |
针对整数的特殊Index |
MultiIndex |
'层次化'索引对象,表示单个轴上的多次索引 |
DatetimeIndex |
存储纳秒级时间戳 |
PeriodIndex |
针对Period数据的特殊Index |
frame3
state Nevada Ohio
year
2000 NaN 1.5
2001 2.4 1.7
2002 2.9 3.6
2000 in frame3.index
True
'Ohio' in frame3.columns
True
每个索引都有一些方法和属性
方法 |
说明 |
append |
连接另一个index对象,产生新的index |
diff |
计算差集,并得到一个index |
intersection |
计算交集 |
union |
计算并集 |
isin |
计算y一个指示值是否都包含在参数集合中的布尔型数组 |
delete |
删除索引i处的元素,并得到新的index |
drop |
将元素插入到索引i处,并得到新的index |
insert |
当各元素均大于等于前一个元素时,返回True |
is_monotonic |
当index没有重复值时,返回True |
is_unique |
当index没有重复值时,返回True |
unique |
计算index中唯一值的数组 |