前言
作为Python中进行数据分析最重要的库之一,Pandas可以帮助我们轻松上手数据分析。在这篇文章中,我会详细总结Pandas的一些基本概念和操作语法,同时我也会将Pandas与SQL做一个简单的对比。话不多说,我们开始。首先我们先导入Pandas库以及与其高度相关的基础库Numpy。
import pandas as pd
import numpy as np
1.Pandas objects
在pandas中,有3种基本的数据结构,分别是Series
,DataFrame
以及Index
。我们来一一做一下介绍。
1.
Series
: 一个Series对象是一个一维的有索引数组,我们可以通过如下方式创建它。
s=pd.Series([0.25,0.5,0.75,1.0])
我们可以通过该对象的value
和index
属性来分别得到它的值以及它的索引。我们来看一下它们的结果。
s.values
# 返回结果为numpy array类型
array([0.25, 0.5 , 0.75, 1. ])
s.index
# 返回结果为pd.Index对象,也就是我上面所说的基本结构中的最后一种
RangeIndex(start=0, stop=4, step=1)
当然我们可以通过索引和切片来获取其中的部分值。比如
s[2]
# 返回结果
0.75
s[1:3]
# 返回结果
1 0.50
2 0.75
dtype: float64
在创建Series object的时候,我们也可以自定义我们需要的索引。
pd.Series([0.25, 0.5, 0.75, 1.0],index=['a', 'b', 'c', 'd'])
# 返回结果
a 0.25
b 0.50
c 0.75
d 1.00
dtype: float64
我们还可以通过传入字典的方式来创建,字典的key会成为索引,而value会成为值,比如下面这个人口数据的例子。
population_dict = {
'California': 38332521,
'New York': 19651127,
'Florida': 19552860,
'Texas': 26448193,
'Illinois': 12882135}
population=pd.Series(population)
population
# 返回结果
California 38332521
New York 19651127
Florida 19552860
Texas 26448193
Illinois 12882135
dtype: int64
2.
DataFrame
:一个DataFrame 对象是一个二维的数组,同时拥有行索引和列名。我们也可以将其理解为一系列对齐的Series对象的组合。这里对齐代表这些Series对象共享行索引。
我们来看一下如何创建一个简单的DataFrame 对象。
1.通过给Series对象赋予列名,将其转化为一个DataFrame对象。我们使用上面我们创建的人口数的Series对象。
pd.DataFrame(population, columns=['population'])
# 返回结果
population
California 38332521
New York 19651127
Florida 19552860
Texas 26448193
Illinois 12882135
我们可以再创建一个名为area新的Series对象,然后将其和上面的population合并成一个名为state的字典,然后通过传入该字典来创建一个多列名的DataFrame对象。如下
area = pd.Series({
'California': 423967, 'Texas': 695662, 'New York': 141297,'Florida': 170312, 'Illinois': 149995})
state={
'population': population,'area': area}
pd.DataFrame(state)
# 返回结果
population area
California 38332521 423967
Florida 19552860 170312
Illinois 12882135 149995
New York 19651127 141297
Texas 26448193 695662
除了上述使用Series对象来创建DataFrame对象之外,我们还可以简单地通过传入list of dicts 或者 dict of lists的方式来创建。
# 1.list of dicts
data1=[{
'a':i,'b':2*i} for i in range(3)]
pd.DataFrame(data1)
# 返回结果
a b
0 0 0
1 1 2
2 2 4
# 2.dict of lists
data2={
'a':[i for i in range(3)],'b':[2*i for i in range(3)]}
pd.DataFrame(data2)
# 返回结果
a b
0 0 0
1 1 2
2 2 4
除此之外,我们也可以使用传入一个二维的numpy.array来创建DataFrame对象。
pd.DataFrame(np.random.rand(3, 2),
columns=['foo', 'bar'],
index=['a', 'b', 'c'])
# 返回结果
foo bar
a 0.550997 0.926800
b 0.536806 0.505545
c 0.766064 0.364634
最后我们简单介绍一下Index对象。
3.
Index
:我们在Series和DataFrame的介绍过程中其实已经反复看到Index的影子了,但是Index本身其实也是一个有趣的结构,我们既可以把它看作一个不可变的数组,也可以将其看作一种multi-set(可以包含重复值的集合),其支持python 内置数据结构set的基本操作,如&,|,^等。
idx=pd.Index([2,3,4,5,7])
idx
# 返回结果
Int64Index([2, 3, 5, 7, 11], dtype='int64')
# retrieve value
idx[1]
# slice
idx[::2]
# 但是我们不能去用一般的方法修改它。
idx[1]=0
将其当作一个集合。
idx1 = pd.Index([1, 3, 5, 7, 9])
idx2 = pd.Index([2, 3, 5, 7, 11])
idx1&idx2
# 返回结果
Int64Index([3, 5, 7], dtype='int64')
idx1|idx2
# 返回结果
Int64Index([1, 2, 3, 5, 7, 9, 11], dtype='int64')
idx1 ^ idx2
# 返回结果
Int64Index([1, 2, 9,