第5章 Pandas入门(1)

阿里云2000元红包!本站用户参与享受九折优惠!

以下内容主要学习自《利用Python进行数据分析》

第5章 Pandas入门(1)

pandas所包含的数据结构和数据处理工具,使得在pandas中进行数据清洗和分析非常快捷。从2010年成为开源项目以来,pandas的开发者社区已经有超过800个代码贡献者,他们帮助pandas成熟、成为在数据领域被广泛应用的大型类库。

pandas支持大部分NumPy风格的数组计算,尤其是数据函数以及没有for循环的各种数据处理。但他们也有差异:

  • pandas是用来处理表格型或异质型数据的(想想关系型数据库中的表);
  • 而NumPy更适合处理同质型的、数值类的数组。

作为约定,我会使用下面的快捷方式导入pandas:

import pandas as pd

因此,只要你看到pd.,就表示对pandas的引用。

数据结构

为了入门pandas,你需要熟悉两个常用的数据结构:Series和DataFrame。

为便于理解,可以把DataFrame看成是关系型数据库的一个表、把Serise看成其中的一个列。但需要警惕,它们并不是完全相同,如:尽管DataFrame通常情况下是二维的,但可以用分层索引在DataFrame中展现更高维度的数据。

Series

Series是一种一维的数组型对象,它包含了一个值序列,并包含了数据标签,称为索引(index)。

创建Series

从一个Python列表创建Series

In [1]: import pandas as pd
In [2]: obj = pd.Series([4, 7, -5, 3])
In [3]: obj
Out[3]:
0    4
1    7
2   -5
3    3
dtype: int64

如上所示,Series对象的索引在左侧、值在右侧,默认的索引是从0到n-1的数字索引(n是数据的总量)。如果不使用默认的数字索引,可以自定义标签索引,如下:

In [4]: obj = pd.Series([4,7, -5, 3], index=['d', 'b', 'a', 'c'])
In [5]: obj
Out[5]:
d    4
b    7
a   -5
c    3
dtype: int64

您还可以修改Series对象的标签索引,但必须保证索引个数与元素个数相等

# 为Series对象指定一个名字
In [6]: obj.name = 'my datas'
# 为Series对象指定新的标签索引
In [7]: obj.index = ['张三','李四','王五','杨六']
In [8]: obj
Out[8]:
张三    4
李四    7
王五   -5
杨六    3
Name: my datas, dtype: int64

如果已经有一个包含数据的Python字典,那么也可以生成一个Series,默认情况下字典的键将成为Series的标签索引,如下:

In [6]: dict_datas = {'Ohio':3500, 'Texas':7100, 'Oregon':1600}
In [7]: obj = pd.Series(dict_datas)
In [8]: obj
Out[8]:
Ohio      3500
Texas     7100
Oregon    1600
dtype: int64

把Python字典对象转换为Series对象时,仍然可以指定标签索引。Series将会自动匹配字典键,对于缺失的将赋值为NaN(not a number),如下:

In [1]: dic_data = {'2018':-0.715068, '2019':-0.068092,'2020':0.448901}
In [2]: years = ['2017','2018','2019','2020']
In [3]: obj = pd.Series(dic_data, index=years)
In [4]: obj  # 因为字典中没有2017,所以,被赋值为NaN
Out[4]:
2017         NaN
2018   -0.715068
2019   -0.068092
2020    0.448901
dtype: float64
访问Series

可以通过values属性index属性分别获得Series对象的值和索引:

In [1]: obj = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
In [2]: obj.values
Out[2]: array([ 4,  7, -5,  3], dtype=int64)
In [3]: obj.index
Out[3]: Index(['d', 'b', 'a', 'c'], dtype='object')

可以使用数字索引、也可以使用标签索引来获取Series中元素的值:

In [4]: obj[0]  # 使用数字索引,获取单个元素值
Out[4]: 4
In [5]: obj['d']  # 使用标签索引,获取单个元素值
Out[5]: 4
In [6]: obj[0:2]  # 使用数字索引,获取多个元素值
Out[6]:
d    4
b    7
dtype: int64
In [7]: obj['d':'b']  # 使用标签索引,获取多个元素值
Out[7]:
d    4
b    7
dtype: int64

某些情景中,您可以使用in关键字来判断Series的索引是否包含某个值:

In [8]: 'b' in obj
Out[8]: True
In [9]: 'e' in obj
Out[9]: False

还可以使用bool值作为滤条件,得到Series对象的子集:

In [10]: obj[obj > 0]  # 选择大于0的元素
Out[10]:
d    4
b    7
c    3
dtype: int64
修改Series的值

通过Series对象的索引(数字或标签均可),可以修改Series对象的值:

In [1]: obj = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
In [2]: obj['b'] = -1  # 通过标签索引修改值
In [3]: obj[2:4] = 0  # 通过数字索引段,修改值
In [4]: obj
Out[4]:
d    4
b   -1
a    0
c    0
dtype: int64
添加Series元素

如果要给Series对象添加单个元素,那么直接为新标签索引赋值即可:

In [5]: obj['e'] = 7
In [6]: obj
Out[6]:
d    4
b   -1
a    0
c    0
e    7
dtype: int64

使用Series对象的append方法可以把多个元素添加到现有的Series对象中:

In [7]: obj2 = pd.Serise([5, -2, 8])
In [8]: obj = obj.append(obj2)
In [9]: obj
Out[9]:
d    4
b   -1
a    0
c    0
e    7
0    5
1   -2
2    8
dtype: int64
删除Series元素

使用drop方法、并指定要删除的标签索引,将删除Series对象中的元素:

In [10]: obj.drop(labels=[0, 'c'])
Out[10]:
d    4
b   -1
a    0
e    7
1   -2
2    8
dtype: int64
运算

可以对Series对象进行四则运算,如下:

In [1]: obj = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
In [3]: obj * 2  # 与标量的四则运算,乘2。
Out[3]:
d     8
b    14
a   -10
c     6
dtype: int64

可以对Series对象应用数学函数,如下:

In [4]: import numpy as np
In [5]: np.exp(obj)  # 求自然指数
Out[5]:
d      54.598150
b    1096.633158
a       0.006738
c      20.085537
dtype: float64

两个Series对象可以用+操作符进行所谓的“数据对齐”操作,你可以认为这个特性与数据库的join操作相似。

In [1]: obj1 =  pd.Series([350, 160, 710, 500],
     ...:  index=['张三','李四', '王五', '杨六'])
In [2]: obj2 =  pd.Series([np.NaN, 350, 160],
     ...: index=['陈七', '张三', '李四'])
In [3]: obj = obj1 + obj2
In [4]: obj
Out[4]:
张三    700.0
李四    320.0
杨六      NaN
王五      NaN
陈七      NaN
dtype: float64

可以使用isnull方法notnull方法判断Series对象是否包含空值。这两个方法,即是Series的实例方法、也是pandas的顶层方法。

# 使用实例方法判断“空值”
In [5]: obj.isnull()
Out[5]:
张三    False
李四    False
杨六     True
王五     True
陈七     True
dtype: bool
# 使用pandas顶层方法判断“非空值”
In [6]: pd.notnull(obj)
Out[6]:
张三     True
李四     True
杨六    False
王五    False
陈七    False
dtype: bool

https://www.jianshu.com/p/dcb6f3588a1d

Python量化投资网携手4326手游为资深游戏玩家推荐:《《我的世界》:阅组件无数?手游排名前三的组件你都见识过吗?

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论