|
|
@@ -6,20 +6,18 @@ Pandas核心的数据类型是`Series`(数据系列)、`DataFrame`(数据
|
|
|
|
|
|
### Series的应用
|
|
|
|
|
|
-Pandas库中的`Series`对象可以用来表示一维数据结构,跟数组非常类似,但是多了一些额外的功能。`Series`的内部结构包含了两个数组,其中一个用来保存数据,另一个用来保存数据的索引,如下图所示。
|
|
|
-
|
|
|
-
|
|
|
+Pandas库中的`Series`对象可以用来表示一维数据结构,跟数组非常类似,但是多了一些额外的功能。`Series`的内部结构包含了两个数组,其中一个用来保存数据,另一个用来保存数据的索引。
|
|
|
|
|
|
#### 创建Series对象
|
|
|
|
|
|
-> **提示**:在执行下面的代码之前,请先导入pandas以及相关的库文件,具体的做法可以参考上一章。
|
|
|
+> **提示**:在执行下面的代码之前,请先导入`pandas`以及相关的库文件,具体的做法可以参考上一章。
|
|
|
|
|
|
- 方法1:通过列表或数组创建Series对象。
|
|
|
|
|
|
代码:
|
|
|
|
|
|
```Python
|
|
|
- # data参数表示数据,index参数表示索引标签
|
|
|
+ # data参数表示数据,index参数表示数据的索引(标签)
|
|
|
# 如果没有指定index属性,默认使用数字索引
|
|
|
ser1 = pd.Series(data=[320, 180, 300, 405], index=['一季度', '二季度', '三季度', '四季度'])
|
|
|
ser1
|
|
|
@@ -40,7 +38,7 @@ Pandas库中的`Series`对象可以用来表示一维数据结构,跟数组非
|
|
|
代码:
|
|
|
|
|
|
```Python
|
|
|
- # 字典中的键就是索引标签,字典中的值就是数据
|
|
|
+ # 字典中的键就是数据的索引(标签),字典中的值就是数据
|
|
|
ser2 = pd.Series({'一季度': 320, '二季度': 180, '三季度': 300, '四季度': 405})
|
|
|
ser2
|
|
|
```
|
|
|
@@ -59,20 +57,20 @@ Pandas库中的`Series`对象可以用来表示一维数据结构,跟数组非
|
|
|
|
|
|
跟数组一样,Series对象也可以进行索引和切片操作,不同的是Series对象因为内部维护了一个保存索引的数组,所以除了可以使用整数索引通过位置检索数据外,还可以通过自己设置的索引标签获取对应的数据。
|
|
|
|
|
|
-- 使用正负向整数索引
|
|
|
+- 使用整数索引
|
|
|
|
|
|
代码:
|
|
|
|
|
|
```Python
|
|
|
- print(ser2[0], ser2[2], ser2[-1])
|
|
|
- ser2[0], ser2[-1] = 350, 360
|
|
|
+ print(ser2[0], ser[1], ser[2], ser[3])
|
|
|
+ ser2[0], ser2[3] = 350, 360
|
|
|
print(ser2)
|
|
|
```
|
|
|
|
|
|
输出:
|
|
|
|
|
|
```
|
|
|
- 320 300 405
|
|
|
+ 320 180 300 405
|
|
|
一季度 350
|
|
|
二季度 180
|
|
|
三季度 300
|
|
|
@@ -80,6 +78,8 @@ Pandas库中的`Series`对象可以用来表示一维数据结构,跟数组非
|
|
|
dtype: int64
|
|
|
```
|
|
|
|
|
|
+ > **提示**:如果要使用负向索引,必须在创建`Series`对象时通过`index`属性指定非数值类型的标签。
|
|
|
+
|
|
|
- 使用自己设置的标签索引
|
|
|
|
|
|
代码:
|
|
|
@@ -257,7 +257,7 @@ Series对象的常用属性如下表所示。
|
|
|
dtype: float64
|
|
|
```
|
|
|
|
|
|
- > **提示**:因为`describe()`返回的也是一个`Series`对象,所以也可以用`ser2.describe()['mean']`来获取平均值。
|
|
|
+ > **提示**:因为`describe()`返回的也是一个`Series`对象,所以可以用`ser2.describe()['mean']`来获取平均值。
|
|
|
|
|
|
如果`Series`对象的数据中有重复元素,我们可以使用`unique()`方法获得去重之后的`Series`对象,如果想要统计重复元素重复的次数,可以使用`value_counts()`方法,这个方法会返回一个`Series`对象,它的索引就是原来的`Series`对象中的元素,而每个元素出现的次数就是返回的`Series`对象中的数据,在默认情况下会按照元素出现次数做降序排列。
|
|
|
|
|
|
@@ -282,117 +282,301 @@ Series对象的常用属性如下表所示。
|
|
|
|
|
|
`Series`对象的`dropna`和`fillna`方法分别用来删除空值和填充空值,具体的用法如下所示。
|
|
|
|
|
|
+ 代码:
|
|
|
+
|
|
|
```Python
|
|
|
ser4 = pd.Series(data=[10, 20, np.NaN, 30, np.NaN])
|
|
|
- ser4.dropna()
|
|
|
+ser4.dropna()
|
|
|
```
|
|
|
|
|
|
输出:
|
|
|
-
|
|
|
+
|
|
|
```
|
|
|
0 10.0
|
|
|
1 20.0
|
|
|
3 30.0
|
|
|
- dtype: float64
|
|
|
+dtype: float64
|
|
|
```
|
|
|
|
|
|
代码:
|
|
|
-
|
|
|
+
|
|
|
```Python
|
|
|
# 将空值填充为40
|
|
|
- ser4.fillna(value=40)
|
|
|
+ser4.fillna(value=40)
|
|
|
```
|
|
|
|
|
|
输出:
|
|
|
-
|
|
|
+
|
|
|
```
|
|
|
0 10.0
|
|
|
1 20.0
|
|
|
2 40.0
|
|
|
3 30.0
|
|
|
4 40.0
|
|
|
- dtype: float64
|
|
|
+dtype: float64
|
|
|
```
|
|
|
|
|
|
代码:
|
|
|
-
|
|
|
+
|
|
|
```Python
|
|
|
# backfill或bfill表示用后一个元素的值填充空值
|
|
|
# ffill或pad表示用前一个元素的值填充空值
|
|
|
- ser4.fillna(method='ffill')
|
|
|
+ser4.fillna(method='ffill')
|
|
|
```
|
|
|
|
|
|
输出:
|
|
|
-
|
|
|
+
|
|
|
```
|
|
|
0 10.0
|
|
|
1 20.0
|
|
|
2 20.0
|
|
|
3 30.0
|
|
|
4 30.0
|
|
|
- dtype: float64
|
|
|
+dtype: float64
|
|
|
```
|
|
|
-
|
|
|
+
|
|
|
需要提醒大家注意的是,`dropna`和`fillna`方法都有一个名为`inplace`的参数,它的默认值是`False`,表示删除空值或填充空值不会修改原来的`Series`对象,而是返回一个新的`Series`对象来表示删除或填充空值后的数据系列,如果将`inplace`参数的值修改为`True`,那么删除或填充空值会就地操作,直接修改原来的`Series`对象,那么方法的返回值是`None`。后面我们会接触到的很多方法,包括`DataFrame`对象的很多方法都会有这个参数,它们的意义跟这里是一样的。
|
|
|
|
|
|
+ `Series`对象的`mask`和`where`方法可以将满足或不满足条件的值进行替换,如下所示。
|
|
|
+
|
|
|
+ 代码:
|
|
|
+
|
|
|
+ ```Python
|
|
|
+ ser5 = pd.Series(range(5))
|
|
|
+ ser5.where(ser5 > 0)
|
|
|
+ ```
|
|
|
+
|
|
|
+ 输出:
|
|
|
+
|
|
|
+ ```
|
|
|
+ 0 NaN
|
|
|
+ 1 1.0
|
|
|
+ 2 2.0
|
|
|
+ 3 3.0
|
|
|
+ 4 4.0
|
|
|
+ dtype: float64
|
|
|
+ ```
|
|
|
+
|
|
|
+ 代码:
|
|
|
+
|
|
|
+ ```Python
|
|
|
+ ser5.where(ser5 > 1, 10)
|
|
|
+ ```
|
|
|
+
|
|
|
+ 输出:
|
|
|
+
|
|
|
+ ```
|
|
|
+ 0 10
|
|
|
+ 1 10
|
|
|
+ 2 2
|
|
|
+ 3 3
|
|
|
+ 4 4
|
|
|
+ dtype: int64
|
|
|
+ ```
|
|
|
+
|
|
|
+ 代码:
|
|
|
+
|
|
|
+ ```Python
|
|
|
+ ser5.mask(ser5 > 1, 10)
|
|
|
+ ```
|
|
|
+
|
|
|
+ 输出:
|
|
|
+
|
|
|
+ ```
|
|
|
+ 0 0
|
|
|
+ 1 1
|
|
|
+ 2 10
|
|
|
+ 3 10
|
|
|
+ 4 10
|
|
|
+ dtype: int64
|
|
|
+ ```
|
|
|
+
|
|
|
`Series`对象的`apply`和`map`方法可以用于对数据进行处理,代码如下所示。
|
|
|
|
|
|
- `Series`对象的`mask`和`where`方法可以将满足或不满足条件的值进行替换。
|
|
|
+ 代码:
|
|
|
|
|
|
- `Series`对象的`sort_index`和`sort_values`方法可以用于对索引和数据的排序,具体的用法请参考下面的例子。
|
|
|
+ ```Python
|
|
|
+ ser6 = pd.Series(['cat', 'dog', np.nan, 'rabbit'])
|
|
|
+ ser6
|
|
|
+ ```
|
|
|
|
|
|
- `Series`对象的`value_counts`方法可以统计每个值出现的次数并且以从大到小的顺序进行排列,`Series`对象的`unique`方法可以获取到不重复的值。
|
|
|
+ 输出:
|
|
|
|
|
|
+ ```
|
|
|
+ 0 cat
|
|
|
+ 1 dog
|
|
|
+ 2 NaN
|
|
|
+ 3 rabbit
|
|
|
+ dtype: object
|
|
|
+ ```
|
|
|
|
|
|
+ 代码:
|
|
|
+
|
|
|
+ ```Python
|
|
|
+ ser6.map({'cat': 'kitten', 'dog': 'puppy'})
|
|
|
+ ```
|
|
|
+
|
|
|
+ 输出:
|
|
|
+
|
|
|
+ ```
|
|
|
+ 0 kitten
|
|
|
+ 1 puppy
|
|
|
+ 2 NaN
|
|
|
+ 3 NaN
|
|
|
+ dtype: object
|
|
|
+ ```
|
|
|
+
|
|
|
+ 代码:
|
|
|
+
|
|
|
+ ```Python
|
|
|
+ ser6.map('I am a {}'.format, na_action='ignore')
|
|
|
+ ```
|
|
|
+
|
|
|
+ 输出:
|
|
|
+
|
|
|
+ ```
|
|
|
+ 0 I am a cat
|
|
|
+ 1 I am a dog
|
|
|
+ 2 NaN
|
|
|
+ 3 I am a rabbit
|
|
|
+ dtype: object
|
|
|
+ ```
|
|
|
+
|
|
|
+ 代码:
|
|
|
+
|
|
|
+ ```Python
|
|
|
+ ser7 = pd.Series([20, 21, 12], index=['London', 'New York', 'Helsinki'])
|
|
|
+ ser7
|
|
|
+ ```
|
|
|
+
|
|
|
+ 输出:
|
|
|
+
|
|
|
+ ```
|
|
|
+ London 20
|
|
|
+ New York 21
|
|
|
+ Helsinki 12
|
|
|
+ dtype: int64
|
|
|
+ ```
|
|
|
+
|
|
|
+ 代码:
|
|
|
+
|
|
|
+ ```Python
|
|
|
+ ser7.apply(np.square)
|
|
|
+ ```
|
|
|
+
|
|
|
+ 输出:
|
|
|
+
|
|
|
+ ```
|
|
|
+ London 400
|
|
|
+ New York 441
|
|
|
+ Helsinki 144
|
|
|
+ dtype: int64
|
|
|
+ ```
|
|
|
+
|
|
|
+ 代码:
|
|
|
+
|
|
|
+ ```Python
|
|
|
+ ser7.apply(lambda x, value: x - value, args=(5, ))
|
|
|
+ ```
|
|
|
+
|
|
|
+ 输出:
|
|
|
+
|
|
|
+ ```
|
|
|
+ London 15
|
|
|
+ New York 16
|
|
|
+ Helsinki 7
|
|
|
+ dtype: int64
|
|
|
+ ```
|
|
|
+
|
|
|
+ `Series`对象的`sort_index`和`sort_values`方法可以用于对索引和数据的排序,排序方法有一个名为`ascending`的布尔类型参数,该参数用于控制排序的结果是升序还是降序;而名为`kind`的参数则用来控制排序使用的算法,默认使用了`quicksort`,也可以选择`mergesort`或`heapsort`;如果存在空值,那么可以用`na_position`参数空值放在最前还是最后,默认是`last`。
|
|
|
|
|
|
#### 绘制图表
|
|
|
|
|
|
-Series对象有一个名为`plot`的方法可以用来生成图表,如果选择生成折线图、散点图、柱状图等,默认会使用Series对象的索引作为横坐标,使用Series对象的数据作为纵坐标。
|
|
|
-
|
|
|
-
|
|
|
+Series对象有一个名为`plot`的方法可以用来生成图表,如果选择生成折线图、饼图、柱状图等,默认会使用Series对象的索引作为横坐标,使用Series对象的数据作为纵坐标。
|
|
|
|
|
|
-利用Series对象的数据也可以生成表示占比的饼图和显示数据分布的直方图,如下面的代码所示。
|
|
|
+首先导入`matplotlib`中`pyplot`模块并进行必要的配置。
|
|
|
|
|
|
+```Python
|
|
|
+import matplotlib.pyplot as plt
|
|
|
|
|
|
+# 配置支持中文的非衬线字体(默认的字体无法显示中文)
|
|
|
+plt.rcParams['font.sans-serif'] = ['SimHei', ]
|
|
|
+# 使用指定的中文字体时需要下面的配置来避免负号无法显示
|
|
|
+plt.rcParams['axes.unicode_minus'] = False
|
|
|
+```
|
|
|
|
|
|
-### DataFrame的应用
|
|
|
-
|
|
|
-#### 创建DataFrame对象
|
|
|
+创建`Series`对象并绘制对应的柱状图。
|
|
|
|
|
|
+```Python
|
|
|
+ser8 = pd.Series({'一季度': 400, '二季度': 520, '三季度': 180, '四季度': 380})
|
|
|
+# 通过Series对象的plot方法绘图(kind='bar'表示绘制柱状图)
|
|
|
+ser8.plot(kind='bar', color=['r', 'g', 'b', 'y'])
|
|
|
+# x轴的坐标旋转到0度(中文水平显示)
|
|
|
+plt.xticks(rotation=0)
|
|
|
+# 在柱状图的柱子上绘制数字
|
|
|
+for i in range(4):
|
|
|
+ plt.text(i, ser8[i] + 5, ser8[i], ha='center')
|
|
|
+# 显示图像
|
|
|
+plt.show()
|
|
|
+```
|
|
|
|
|
|
+
|
|
|
|
|
|
-#### 基本属性和方法
|
|
|
+绘制反映每个季度占比的饼图。
|
|
|
|
|
|
+```Python
|
|
|
+# autopct参数可以配置在饼图上显示每块饼的占比
|
|
|
+ser8.plot(kind='pie', autopct='%.1f%%')
|
|
|
+# 设置y轴的标签(显示在饼图左侧的文字)
|
|
|
+plt.ylabel('各季度占比')
|
|
|
+plt.show()
|
|
|
+```
|
|
|
|
|
|
+
|
|
|
|
|
|
-#### 索引和切片
|
|
|
-
|
|
|
-
|
|
|
+### DataFrame的应用
|
|
|
|
|
|
-#### 相关运算
|
|
|
+#### 创建DataFrame对象
|
|
|
|
|
|
|
|
|
|
|
|
- #### 缺失值处理
|
|
|
+#### 基本属性和方法
|
|
|
|
|
|
|
|
|
|
|
|
-#### 数据离散化
|
|
|
+#### 获取数据
|
|
|
|
|
|
+1. 索引和切片
|
|
|
+2. 数据筛选
|
|
|
|
|
|
+#### 数据处理
|
|
|
|
|
|
-#### 数据的合并
|
|
|
+1. 数据清洗
|
|
|
+ - 缺失值处理
|
|
|
+ - 重复值处理
|
|
|
+ - 异常值处理
|
|
|
+2. 数据转换
|
|
|
+ - `apply`和`applymap`方法
|
|
|
+ - 字符串向量
|
|
|
+ - 时间日期向量
|
|
|
+3. 数据合并
|
|
|
+ - `concat`函数
|
|
|
+ - `merge`函数
|
|
|
|
|
|
+#### 数据分析
|
|
|
|
|
|
+1. 描述性统计信息
|
|
|
+2. 分组聚合操作
|
|
|
+ - `groupby`方法
|
|
|
+ - 透视表和交叉表
|
|
|
+ - 数据分箱
|
|
|
|
|
|
-#### 交叉表和透视表
|
|
|
+#### 数据可视化
|
|
|
|
|
|
-1. 交叉表:根据一个数据系列计算另一个数据系列的统计结果得到的`DataFrame`对象。
|
|
|
-2. 透视表:将`DataFrame`的列分别作为行索引和列索引,然后对指定的列应用聚合函数得到的结果。
|
|
|
+1. 用`plot`方法出图
|
|
|
+2. 其他方法
|
|
|
|
|
|
-#### 分组和聚合
|
|
|
|
|
|
|
|
|
|
|
|
-#### 绘制图表
|
|
|
|