Panda basic
(本博客基于Kaggle教材 link:https://www.kaggle.com/learn/pandas)
Panda
Panda 是一个强大的 Python 库,主要用于数据分析。在本人的学习中,我认为Panda与SQL有异曲同工之妙,如果你直接接触过SQL你可以把其理解为一个Python版本的SQL
1 |
|
Panda 有两个核心概念:DataFrame 和 Series。
DataFrame:表格数据
DataFrame 就像一个表格,有行和列。
- 列(column):表格中竖着的一列数据,可以理解为 Excel 中的一列。
- 行(record / row):表格中横着的一行数据,可以理解为 Excel 中的一行。
1 |
|
创建 DataFrame 就像创建一个字典:
- Key:列名
- Value:列的数据
例如:
1 |
|
Series:一列数据
Series 就像一个列表,只有一列数据。可以看作是 DataFrame 的一部分。
1 |
|
Series 的索引也可以是字符串:
1 |
|
读取数据
Panda 可以读取 CSV 文件,CSV 文件是一种常见的表格数据格式。
1 |
|
index_col=0
的作用是告诉 Panda,CSV 文件中已经有一列作为索引了,不要再自动创建新的索引。
shape
属性可以查看 DataFrame 的大小(行数和列数):
1 |
|
head()
方法可以查看 DataFrame 的前几行数据:
1 |
|
保存数据
Panda 可以将 DataFrame 保存为 CSV 文件:
1 |
|
数据选择
选取数据
Panda 提供了多种选取数据的方法。
原生 Python 方式
可以使用 .
和 []
来选取数据,和 Python 中访问对象属性的方式类似。
Panda 方式:loc
和 iloc
Panda 提供了 loc
和 iloc
两种方法来选取数据。
loc
:使用标签(label)来选取数据,例如行索引或列名。iloc
:使用数字(integer)来选取数据,例如行号或列号。
注意: loc
和 iloc
选取数据时都是先行后列,与 Python 中常见的先列后行不同。
1 |
|
1 |
|
例如:
1 |
|
set_index()
方法可以将 DataFrame 中已有的某一列设置为新的索引:
条件选择
可以使用条件表达式来选取满足条件的数据。
1 |
|
返回:
1 |
|
可以使用 loc
方法结合条件表达式来选取数据:
1 |
|
相当于 SQL 中的 SELECT * FROM reviews WHERE country = 'Italy'
。
可以使用多个条件:
1 |
|
1 |
|
|
表示 “或” (or)&
表示 “与” (and)
isin()
方法可以判断一列的值是否在给定的列表中:
1 |
|
isnull()
和 notnull()
方法可以判断一列的值是否为空:
isnull()
:如果元素是缺失值,则返回 True,否则返回 False。notnull()
:如果元素不是缺失值,则返回 True,否则返回 False。
1 |
|
赋值
可以直接给 DataFrame 添加新的列,并赋值:
1 |
|
可以根据现有列的值计算出新的列的值:
1 |
|
Summary Functions and Maps
Summary Functions 摘要函数
describe()
: 生成列的统计摘要(数值型与字符串型输出不同)。- 数值列:count, mean, std, min, 25%, 50%, 75%, max.
- 字符串列:count, unique, top(最高频值), freq(最高频次数)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62reviews.points.describe() # 数值列示例
reviews.taster_name.describe() # 字符串列示例
```
- **`mean()`**: 计算数值列的平均值。
```python
reviews.points.mean() # 输出平均评分
```
- **`unique()`**: 返回列的唯一值数组。
```python
reviews.taster_name.unique() # 所有品酒师名字
```
- **`value_counts()`**: 统计各唯一值出现的次数。
```python
reviews.taster_name.value_counts() # 品酒师评酒次数统计
```
- idxmax() 返回 Series 或 DataFrame 中最大值的索引。
---
## **Maps 映射**
- **`map()`**: 对Series中的每个元素应用函数,返回新Series。
```python
# 将评分转换为与均值的差值
review_points_mean = reviews.points.mean()
reviews.points.map(lambda p: p - review_points_mean)
```
- **`apply()`**: 对DataFrame的行或列应用函数。
```python
# 转换整个DataFrame的评分列
def remean_points(row):
row.points -= review_points_mean
return row
reviews.apply(remean_points, axis='columns')
```
- **向量化操作**: 使用Pandas内置运算符更高效(如`+`, `-`, `>`等)。
```python
# 直接计算评分与均值的差值
reviews.points - reviews.points.mean()
# 合并两列(如国家与产区)
reviews.country + " - " + reviews.region_1
```
---
## **注意**
- `map()`和`apply()`返回**新对象**,不修改原始数据。
- 向量化操作比`map()`/`apply()`更快,但复杂逻辑仍需后者。
## 数据分组与排序操作
### groupby() - 数据分组
按指定列对数据进行分组,常用于数据聚合分析。
```python
# 按国家分组并计算平均得分
reviews.groupby('country').points.mean()
agg() - 多重统计
在一个操作中执行多个统计聚合。
1 |
|
reset_index() - 重置索引
将多级索引DataFrame转换为普通列。
1 |
|
排序函数
sort_values() - 按值排序
按指定列的值进行排序。
参数:
by
: 用于排序的列名ascending
: 排序方向(默认True升序,False降序)
1 |
|
sort_index() - 按索引排序
按行索引进行排序。
1 |
|
注意: 排序函数返回排序后的新DataFrame,不会修改原始数据。要修改原始数据,需要使用inplace=True
参数。
数据类型和缺失值处理
数据类型操作
dtype 属性
查看单个列的数据类型。
1 |
|
dtypes 属性
查看DataFrame中所有列的数据类型。
1 |
|
astype() - 类型转换
将列转换为指定的数据类型。
1 |
|
缺失值处理
检测缺失值
pd.isnull()
: 检测是否为缺失值(NaN)pd.notnull()
: 检测是否不是缺失值
1 |
|
fillna() - 填充缺失值
用指定的值替换NaN。
1 |
|
replace() - 替换值
替换特定的非空值。
1 |
|
注意事项
- 字符串列的数据类型显示为
object
- NaN在Pandas中总是以
float64
类型存储 - 处理缺失值的函数默认返回新的副本,使用
inplace=True
可以直接修改原数据
数据重命名和合并操作
重命名操作
rename() - 重命名列或索引
1 |
|
rename_axis() - 重命名轴
1 |
|
set_index() - 设置索引
1 |
|
对比 SQL
特性 | Pandas set_index() MultiIndex | SQL CREATE INDEX Composite Index |
---|---|---|
作用 | 修改DataFrame结构,设置行索引 | 创建独立的索引对象,优化查询 |
数据结构 | 索引是DataFrame的一部分 | 索引是独立的元数据 |
多重索引 | 支持多重索引(MultiIndex) | 支持复合索引 |
更新方式 | 修改索引通常需要重建DataFrame | 数据库自动维护索引更新 |
性能影响 | Pandas索引修改的计算开销(如内存占用) | 操作耗时(因维护索引) |
主要用途 | 数据分析、标签选择、对齐和分组 | 查询性能优化 |
数据合并操作
concat() - 数据拼接
将多个DataFrame或Series对象连接在一起。
1 |
|
join() - 基于索引合并
根据索引将两个DataFrame合并。
1 |
|
注意事项
rename()
和set_index()
默认返回新的DataFrame- 使用
inplace=True
参数可以直接修改原始数据 - 合并操作前建议检查数据结构,避免出现意外结果
- 处理重复列名时,建议使用合适的后缀