Numpy部分
1. Ndarray 对象
NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。
从上面的描述中,我们可以得出Ndarray对象的两个重要特点:
- ndarray中的每个元素的数据类型相同;
- ndarray 中的每个元素在内存中都有相同存储大小的区域;
Pandas部分
1. Pandas数据结构
Pandas处理以下三个数据结构:
- 系列
Series
;- 数据帧
DataFrame
;- 面板
Panel
;
考虑这些数据结构的最好方法是,较高维数据结构是其较低维数据结构的容器
例如,DataFrame
是Series
的容器,Panel
是DataFrame
的容器
数据结构 | 维数 | 描述 |
---|---|---|
系列 | 1 | 1D标记均匀数组,大小不变 |
数据帧 | 2 | 一般2D标记,大小可变的表结构与潜在的异质类型的列 |
面板 | 3 | 一般3D标记,大小可变数组 |
1.1. Series
系列是具有均匀数据的一维数组结构。例如,以下系列是整数:10,23,56,...
的集合
特点:
- 均匀数据;
- 尺寸大小不变;
- 数据的值可变;
1.2. DataFrame
数据帧(DataFrame)是一个具有异构数据的二维数组
姓名 | 年龄 | 性别 | 等级 |
---|---|---|---|
Maxsu | 25 | 男 | 4.45 |
Katie | 34 | 女 | 2.78 |
Vina | 46 | 女 | 3.9 |
数据以行和列表示。每列表示一个属性,每行代表一个人
上面数据帧中四列的数据类型如下:
列 | 类型 |
---|---|
姓名 | 字符串 |
年龄 | 整数 |
性别 | 字符串 |
等级 | 浮点型 |
2. Pandas快速入门
2.1. 对象创建
(1)创建Series
通过传递值列表来创建一个系列,让Pandas创建一个默认的整数索引:
1 | s = pd.Series([1,3,5,np.nan,6,8]) |
(2)创建DataFrame
通过传递numpy数组,使用datetime索引和标记列来创建DataFrame:
1 | dates = pd.date_range('20170101', periods=7) |
也可以通过传递可以转换为类似系列的对象的字典来创建DataFrame。参考以下示例代码:
1 | df2 = pd.DataFrame({ 'A' : 1., |
可以通过dtypes
来查看每一列的数据类型:
1 | >> df2.dtypes |
2.2. 查看数据
查看DataFrame的顶部和底部的数据行:
1 | dates = pd.date_range('20170101', periods=7) |
显示索引,列和底层numpy数据:
1 | dates = pd.date_range('20170101', periods=7) |
描述显示数据的快速统计摘要:
1 | print(df.describe()) |
2.3. 对DataFrame的简单操作
下面的实例操作都是对以下命令产生的DataFrame进行的操作:
1 | dates = pd.date_range('20170101', periods=6) |
(1)调换转置
1 | print(df.T) |
(2)通过轴排序:
1 | # 通过轴1进行降序排序,即按照列名进行降序排序 |
(3)按值排序
1 | print(df.sort_values(by='B')) |
2.4. 选择/索引DataFrame区块
在Pandas中,对DataFrame进行区块切片,比较容易搞不清楚的是它到底在对行进行切片,还是在对列进行切片?
比如,按标签进行选择的基本语法为:df.loc[·]
当方括号中有两个维度的值,即有用逗号隔开的前后两个值,那么前面的那个是行的索引或行名,后一个是列的索引或列名,但是当只有一个维度的值时,例如df.loc[datas[0]]
,那么它是优先对行进行搜索然后切片,还是对列优先?
默认对行进行切片
可以对上面一直用到的测试数据做一个小小的实验:
df.loc[datas[0]]
能正常执行;df.loc['A']
报错
(1)
df[·]
或df.A
形式df[·]
和df.A
形式都可以对列进行索引,df['A']
与df.A
的效果是一样的,当只按列进行索引时,df[·]
形式还可以同时索引多列,如:df[['A','B']]
df[·]
形式除了上面提到的可以索引列之外,还可以对行进行索引,不过此时只能使用数值进行索引,且必须为以a:b
形式的一个区间,如:df[0:1]
注意:
df[·]
形式要么以列名进行列索引,要么以行区间值进行行索引,不能同时进行行索引和列索引(2)
df.loc[·]
形式上面已经讨论了,
df.loc[·]
形式默认进行行索引(不建议使用这种方法,不规范也不好记,容易混淆),它也可以同时进行索引和列索引,但必须为df.loc[·,·]
形式注意:
df.loc[·]
形式的索引方式必须为标签名,不可以用位置数值进行索引(3)
df.iloc[·]
形式这种索引方式类似于Numpy,以位置数值进行索引/切片
一般情况下都是对行和列同时进行索引,即使用形式为
df.iloc[·,·]
当然也只可以值进行一个维度的索引,此时默认为对行进行索引(不建议使用这种方法,不规范也不好记,容易混淆)
(4)布尔索引
使用单列的值来选择数据:
1
2
3
4
5
6print(df[df.A > 0])
# A B C D
# 2017-01-03 0.276486 -1.003779 0.721863 -0.558061
# 2017-01-04 1.177206 -0.464778 -0.116442 -0.385712
# 2017-01-06 0.846665 -1.398207 -0.145356 0.924342从满足布尔条件的DataFrame中选择值:
1
2
3
4
5
6
7
8
9print(df[df > 0])
# A B C D
# 2017-01-01 NaN 1.963213 0.643244 0.945643
# 2017-01-02 0.364237 0.917368 NaN NaN
# 2017-01-03 0.702624 NaN 0.088565 NaN
# 2017-01-04 1.274313 NaN 2.313910 NaN
# 2017-01-05 2.586315 0.588273 NaN 1.482597
# 2017-01-06 NaN 0.405928 0.309201 NaN
参考资料:
(1) 菜鸟教程《Numpy教程》
(2) 易教程《Pandas教程》