万字长文详解Python数据分析利器Pandas以及其与SQL的对比

前言

作为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])

我们可以通过该对象的valueindex属性来分别得到它的值以及它的索引。我们来看一下它们的结果。

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,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值