Pandas快速上手:数据分析与处理实用教程
Pandas 快速上手:数据分析与处理实用教程
Pandas 是 Python 数据科学生态系统中最受欢迎的库之一,以其强大的数据分析和处理能力而闻名。它提供了高效的数据结构和操作工具,使得数据清洗、转换、分析和可视化变得轻松快捷。本教程将带你快速入门 Pandas,掌握其核心概念和常用操作,助你高效处理各种数据分析任务。
1. 为什么选择 Pandas?
- 基于 NumPy 构建: Pandas 构建在 NumPy 之上,继承了 NumPy 的高性能数组计算能力。
- 数据结构丰富: 提供了 Series (一维数组) 和 DataFrame (二维表格) 两种核心数据结构,能够灵活地表示各种类型的数据。
- 数据操作便捷: 内置了大量数据操作函数,如数据清洗、过滤、排序、分组、聚合等,无需编写复杂的循环代码。
- 与其他库集成良好: 可以与 Matplotlib、Seaborn 等可视化库无缝衔接,轻松实现数据可视化。
- 社区活跃: 拥有庞大的用户和开发者社区,遇到问题可以轻松获得帮助和解决方案。
2. 安装与导入
安装 Pandas 非常简单,可以使用 pip 命令:
bash
pip install pandas
在 Python 代码中导入 Pandas:
python
import pandas as pd
通常使用 pd
作为 Pandas 的别名,这是一种约定俗成的做法。
3. 核心数据结构:Series 和 DataFrame
-
Series:一维带标签数组
Series 类似于一维数组,但每个元素都带有一个标签,称为索引 (index)。
```python
创建一个 Series
s = pd.Series([1, 3, 5, 7, 9], index=['a', 'b', 'c', 'd', 'e'])
print(s)输出结果:
a 1
b 3
c 5
d 7
e 9
dtype: int64
访问元素
print(s['b']) # 输出:3
print(s[1]) # 输出:3 (也支持通过位置访问)Series 属性
print(s.values) # 输出:[1 3 5 7 9] (值)
print(s.index) # 输出:Index(['a', 'b', 'c', 'd', 'e'], dtype='object') (索引)
``` -
DataFrame:二维表格数据结构
DataFrame 是 Pandas 中最常用的数据结构,它类似于一个二维表格,由多个 Series 组成,每个 Series 代表一列,所有 Series 共享同一个索引。
```python
创建一个 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 28, 32],
'City': ['New York', 'London', 'Paris', 'Tokyo']}
df = pd.DataFrame(data)
print(df)输出结果:
Name Age City
0 Alice 25 New York
1 Bob 30 London
2 Charlie 28 Paris
3 David 32 Tokyo
访问列
print(df['Name']) # 输出:Series 包含所有 Name
print(df.Age) # 另一种访问列的方式 (列名是合法的 Python 变量名时才可以使用)访问行 (使用 .loc 或 .iloc)
print(df.loc[0]) # 通过标签访问第一行
print(df.iloc[0]) # 通过位置访问第一行DataFrame 属性
print(df.shape) # 输出:(4, 3) (行数, 列数)
print(df.columns) # 输出:Index(['Name', 'Age', 'City'], dtype='object') (列名)
print(df.index) # 输出:RangeIndex(start=0, stop=4, step=1) (行索引)
print(df.info()) # 显示 DataFrame 的基本信息 (列名、数据类型、非空值数量等)
print(df.describe())# 显示 DataFrame 的统计信息 (均值、标准差、最小值、最大值等)```
4. 数据读取与写入
Pandas 支持多种数据格式的读取和写入,例如 CSV、Excel、JSON、SQL 数据库等。
-
读取 CSV 文件:
python
df = pd.read_csv('data.csv') # 假设有一个名为 data.csv 的文件
pd.read_csv
还有很多参数可以定制,如:
*sep
: 指定分隔符,默认为逗号。
*header
: 指定哪一行作为列名,默认为第一行。
*index_col
: 指定哪一列作为行索引。
*encoding
: 指定文件编码。
*skiprows
: 跳过指定的行
*nrows
: 只读取指定数量的行。 -
写入 CSV 文件:
python
df.to_csv('output.csv', index=False) # 将 DataFrame 写入 output.csv,不包含行索引
pd.to_csv
常用参数:
*index
: 是否写入行索引,默认为 True.
*sep
: 指定分隔符
*header
: 是否写入列名,默认为True
*encoding
: 指定文件编码 -
读取 Excel 文件:
python
df = pd.read_excel('data.xlsx', sheet_name='Sheet1') # 读取名为 data.xlsx 的 Excel 文件中名为 Sheet1 的工作表 -
写入 Excel 文件:
python
df.to_excel('output.xlsx', sheet_name='Sheet1', index=False) # 将 DataFrame 写入 output.xlsx,工作表名为 Sheet1,不包含行索引
5. 数据清洗与处理
Pandas 提供了丰富的数据清洗和处理功能,这是数据分析的关键步骤。
-
缺失值处理:
```python
检查缺失值
print(df.isnull()) # 返回一个布尔 DataFrame,True 表示缺失值
print(df.isnull().sum()) # 统计每列缺失值的数量删除包含缺失值的行或列
df_dropna = df.dropna() # 删除包含缺失值的行
df_dropna_axis1 = df.dropna(axis=1) # 删除包含缺失值的列
df_dropna_thresh = df.dropna(thresh=2) #保留至少有2个非NaN值的行填充缺失值
df_fillna = df.fillna(0) # 用 0 填充所有缺失值
df_fillna_mean = df.fillna(df.mean()) # 用每列的均值填充缺失值
df_ffill = df.ffill() #使用前一个非缺失值填充
df_bfill = df.bfill() #使用后一个非缺失值填充```
-
重复值处理:
```python
检查重复值
print(df.duplicated()) # 返回一个布尔 Series,True 表示重复行
删除重复值
df_drop_duplicates = df.drop_duplicates() # 删除所有重复行
df_drop_duplicates_subset = df.drop_duplicates(subset=['Name', 'Age']) #根据指定列删除重复行,保留第一个出现的重复行keep : {'first', 'last', False}, 默认为 'first'
- 'first' : 删除重复项,除了第一次出现的重复项。
- 'last' : 删除重复项,除了最后一次出现的。
- False : 删除所有重复项。
```
-
数据类型转换:
python
df['Age'] = df['Age'].astype(float) # 将 Age 列的数据类型转换为 float
df['Date'] = pd.to_datetime(df['Date']) #将 Date 列的数据类型转换为 datetime -
数据筛选:
```python
选择 Age 大于 28 的行
df_filtered = df[df['Age'] > 28]
选择 Age 大于 28 且 City 为 'London' 的行
df_filtered2 = df[(df['Age'] > 28) & (df['City'] == 'London')]
使用 .loc 和 .iloc 进行更复杂的筛选
df_loc = df.loc[df['Age'] > 28, ['Name', 'City']] # 选择 Age 大于 28 的行的 Name 和 City 列
``` -
数据排序:
```python
按 Age 列升序排序
df_sorted = df.sort_values(by='Age')
按 Age 列降序排序
df_sorted_desc = df.sort_values(by='Age', ascending=False)
按多列排序
df_sorted_multi = df.sort_values(by=['Age', 'Name'], ascending=[False, True]) # 先按 Age 降序,再按 Name 升序
``` -
字符串处理:
Pandas 的 Series 对象提供了
str
属性,可以访问各种字符串处理方法。```python
将 Name 列的所有字符串转换为大写
df['Name'] = df['Name'].str.upper()
查找 Name 列中包含 'li' 的字符串
df_contains = df[df['Name'].str.contains('li')]
更多字符串处理方法
.str.lower(): 转换为小写
.str.len(): 计算字符串长度
.str.startswith(): 检查是否以指定字符串开头
.str.endswith(): 检查是否以指定字符串结尾
.str.replace(): 替换字符串
.str.split(): 分割字符串
.str.strip(): 去除字符串两端的空白字符
.str.extract() : 使用正则表达式提取
```
* 数据分组与聚合:```python
# 按 City 列分组,计算每组的平均 Age
df_grouped = df.groupby('City')['Age'].mean()# 按 City 列分组,计算每组的多个统计量
df_grouped_agg = df.groupby('City').agg({'Age': ['mean', 'min', 'max'], 'Name': 'count'})
#还可以自定义聚合函数
# def my_func(x):
# return x.max() - x.min()
# df.groupby('City').agg(my_func)print(df_grouped_agg)
``` -
数据合并:
```python
创建两个 DataFrame
df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'], 'value1': [1, 2, 3, 4]})
df2 = pd.DataFrame({'key': ['B', 'D', 'E', 'F'], 'value2': [5, 6, 7, 8]})使用 merge() 函数进行合并 (类似 SQL 的 join)
df_merged = pd.merge(df1, df2, on='key', how='inner') # 内连接,只保留 key 列相同的行
how 参数:
- 'inner': 内连接 (默认)
- 'left': 左连接,保留左边 DataFrame 的所有行
- 'right': 右连接,保留右边 DataFrame 的所有行
- 'outer': 外连接,保留两个 DataFrame 的所有行
使用 concat() 函数进行连接 (沿着行或列进行拼接)
df_concatenated = pd.concat([df1, df2], axis=0) # 沿着行方向连接 (上下拼接)
axis 参数:
- 0: 沿着行方向 (默认)
- 1: 沿着列方向 (左右拼接)
使用join(),基于索引的合并
df1.join(df2, how='left')
```
-
数据透视表:
```python
创建一个 DataFrame
data = {'Date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02', '2023-01-01', '2023-01-02'],
'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
'Value': [10, 15, 12, 18, 20, 25]}
df = pd.DataFrame(data)创建一个数据透视表,以 Date 为行索引,Category 为列索引,计算 Value 的平均值
pivot_table = df.pivot_table(index='Date', columns='Category', values='Value', aggfunc='mean')
print(pivot_table)
# aggfunc 参数: 指定聚合函数,默认为 'mean' (平均值),可以是单个函数或函数列表。
```
6. 数据可视化
Pandas 可以与 Matplotlib 和 Seaborn 等可视化库无缝集成,方便地进行数据可视化。
```python
import matplotlib.pyplot as plt
创建一个 DataFrame
data = {'Year': [2018, 2019, 2020, 2021, 2022],
'Sales': [100, 120, 150, 180, 200]}
df = pd.DataFrame(data)
使用 Pandas 内置的 plot() 方法绘制折线图
df.plot(x='Year', y='Sales')
plt.show()
使用 Matplotlib 自定义绘图
plt.plot(df['Year'], df['Sales'])
plt.xlabel('Year')
plt.ylabel('Sales')
plt.title('Sales Trend')
plt.grid(True)
plt.show()
可以使用Seaborn 绘制更复杂的图形
import seaborn as sns
sns.lineplot(x='Year', y='Sales', data=df)
plt.show()
```
7. 总结
本教程介绍了 Pandas 的核心概念和常用操作,包括 Series 和 DataFrame 数据结构、数据读取与写入、数据清洗与处理、数据分组与聚合、数据合并以及数据可视化。掌握这些基础知识,你就可以开始使用 Pandas 进行各种数据分析任务了。Pandas 的功能非常强大,本教程只是入门,建议进一步学习 Pandas 的高级功能,例如时间序列处理、多层索引、性能优化等,以便更高效地解决实际问题。 强烈建议阅读 Pandas 官方文档 (https://pandas.pydata.org/docs/),获取更详细的信息和示例。