pandas是数据分析领域的常用库,它被专门设计来处理表格和混杂数据,这样的设计让它在数据清洗和分析工作上更有优势。
pandas的数据结构主要为:
Series和DataFrame
Series类似一维数组,它由一组数据和一组与之相关的数据标签组成。Series的表现形式为索引在左值在右。没有制定索引时,自动创建一个0到N-1(N:数据长度)的整数型索引。
#pd.Series创建一个Seies
obj = pd.Series([4,7,-5,3])
Out:
0 4
1 7
2 -5
3 3
dtype: int64
#创建的Series的索引就是字典的键。
In[1]:
data = {'a':4,'b':7,'c':-5,'d':4}
sdata = pd.Series(data)
#改变键的位置来传入可以改变Series的顺序。
#当输入的索引找不到对应值时,结果为NaH。
In[2]:
data = {'a':4,'b':7,'c':-5,'d':4}
index_d = ['d','c','a','e']
sdata = pd.Series(sdata,index=index_d)
Out[1]:
a 4
b 7
c -5
d 4
dtype: int64
Out[2]:
d 4.0
c -5.0
a 4.0
e NaN
dtype: float64
obj = pd.Series([4,7,-5,4],index = ['a','b','c','d'])
Out:
a 4
b 7
c -5
d 4
dtype: int64
通过操作index属性,同样可以获取索引
obj.index
Out:
Index(['a', 'b', 'c', 'd'], dtype='object')
使用NumPy函数或类似NumPy的运算都会保留索引。
In[1]:obj[obj>0] #布尔过滤
Out[1]:
a 4
b 7
d 4
dtype: int64
In[2]:obj*2
Out[2]:
a 8
b 14
c -10
d 8
dtype: int64
In[3]:np.exp(obj)
Out[3]:
a 54.598150
b 1096.633158
c 0.006738
d 54.598150
dtype: float64
pandas的isnull和notnull可用于检测缺失数据。
In[1]:
data = {'a':4,'b':7,'c':-5,'d':4}
index_d = ['d','c','a','e']
sdata = pd.Series(sdata,index=index_d)
pd.isnull(sdata)
In[2]:
data = {'a':4,'b':7,'c':-5,'d':4}
index_d = ['d','c','a','e']
sdata = pd.Series(sdata,index=index_d)
pd.notnull(sdata)
Out[1]:
d False
c False
a False
e True
dtype: bool
Out[2]:
d True
c True
a True
e False
dtype: bool
将两个Series相加,Series会根据运算的索引标签自动对齐数据。
In[1]:
data = {'a':4,'b':7,'c':-5,'d':4}
index_d = ['d','c','a','e']
sdata = pd.Series(sdata,index=index_d)
print(sdata)
sdata2 = pd.Series(data)
print(sdata2)
Out[1]:
stdata:
d 4.0
c -5.0
a 4.0
e NaN
dtype: float64
sdata2:
a 4
b 7
c -5
d 4
dtype: int64
In[2]:
sdata+sdata2
Out[2]:
a 8.0
b NaN
c -10.0
d 8.0
e NaN
dtype: float64
In[1]:
data = {'a':4,'b':7,'c':-5,'d':4}
index_d = ['d','c','a','e']
sdata = pd.Series(sdata,index=index_d)
sdata.name = 'pandas'
sdata.index.name = 'index'
Out[1]:
index
d 4.0
c -5.0
a 4.0
e NaN
Name: pandas, dtype: float64
DataFrome是一个表格型的数据结构。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。DataFrame中的数据是以一个或多 个二维块存放的(而不是列表、字典或别的一维数据结构)。
最常用的方法时直接传入一个由等长列表或NumPy数组组成的字典。
In[1]:
data={
'state':['Ohio','Ohio','Ohio','Nevada','Nevada','Nevada'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]
}
Frame = pd.DataFrame(data)
Out[1]:
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002
5 3.2 Nevada 2003
由结果可以看出,DataFrame自动加上了一个有序排列作为索引。
对于数据量庞大的DataFrame,head方法会选取前五行。
In[1]:
frame.head()
Out[1]:
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002
与Series相似,改变字典键的顺序,同样会改变列的顺序。
In[1]:
Frame = pd.DataFrame(data,columns=['year','state','pop'])
Out[1]:
year state pop
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
与Series相似,传入的值找不到时,也会被标记为Nah。
嵌套字典传给DataFrame时,外层字典的键作为列,内层键作为行索引
In[1]:
pop =
{'Nevada':{2001:2.4,2002:2.9},
....:'Ohio': {2000:1.5,2001: 1.7,2002:3.6}}
Out[1]:
Nevada ohio
2000 NaN 1.5
2001 2.4 1.7
2002 2.9 3.6
通过类似字典的方式,可以将DataFrame的列获取为一个Series。返回的Series有着与DtaFrame相同的索引且其name属性为列索引。
In[1]:
Frame['state']
Out[1]:
0 Ohio
1 Ohio
2 Ohio
3 Nevada
4 Nevada
5 Nevada
Name: state, dtype: object
列可以通过赋值的方法进行修改。注意:将列表或数组赋值给某个列时,其长度必须跟DataFrame的长度匹配;将Series赋值给一个列时,会精确匹配DataFrame的索引,空位将被用NaH替代。
In[1]:
#也可以用类似的方法进行添加列
Frame['pop'] = np.arange(6)
Out[1]:
year state pop
0 2000 Ohio 0
1 2001 Ohio 1
2 2002 Ohio 2
3 2001 Nevada 3
4 2002 Nevada 4
5 2003 Nevada 5
关键字del可以被用来删除列。
In[1]:
del Frame['pop']
Out[1]:
year state
0 2000 Ohio
1 2001 Ohio
2 2002 Ohio
3 2001 Nevada
4 2002 Nevada
5 2003 Nevada