用Python进行数据清洗:实用指南与技巧
立即解锁
发布时间: 2025-09-01 00:51:29 阅读量: 5 订阅数: 7 AIGC 


Python数据清洗实战指南
# 用 Python 进行数据清洗:实用指南与技巧
## 1. 数据清洗概述
数据清洗是为数据分析做准备的必要任务,涵盖了从数据导入、诊断查看、识别异常值和缺失值,到数据整理等一系列工作。它是数据分析流程中至关重要的一环,直接影响到后续分析结果的准确性和可靠性。
## 2. 数据清洗工具与适用人群
### 2.1 工具特点
采用 Python 及其相关生态系统工具(如 pandas、NumPy、matplotlib、SciPy 等)来处理数据清洗任务。这些工具具有强大的功能和广泛的应用场景,能够满足不同类型数据清洗的需求。
### 2.2 适用人群
本书适合那些希望使用不同 Python 工具和技术来处理杂乱、重复和质量不佳数据的人。只要具备基本的 Python 编程知识,就能从本书中获得实用的技巧和方法。
## 3. 数据清洗流程及操作方法
### 3.1 数据导入
数据导入是数据清洗的第一步,不同格式的数据需要采用不同的导入方法。以下是常见数据格式的导入方式:
| 数据格式 | 导入方法 |
| ---- | ---- |
| CSV 文件 | 使用 pandas 的 `read_csv` 函数 |
| Excel 文件 | 使用 pandas 的 `read_excel` 函数 |
| SQL 数据库 | 使用相应的数据库连接库(如 `sqlite3`、`psycopg2` 等)和 pandas 的 `read_sql` 函数 |
| SPSS、Stata 和 SAS 数据 | 使用 `pyreadstat` 等库 |
| R 数据 | 使用 `rpy2` 等库 |
| JSON 数据 | 使用 pandas 的 `read_json` 函数 |
| 网页数据 | 使用 `BeautifulSoup` 和 `pandas` 进行网页抓取和数据提取 |
#### 3.1.1 导入 CSV 文件示例
```python
import pandas as pd
# 读取 CSV 文件
csv_data = pd.read_csv('example.csv')
print(csv_data.head())
```
#### 3.1.2 导入 Excel 文件示例
```python
# 读取 Excel 文件
excel_data = pd.read_excel('example.xlsx')
print(excel_data.head())
```
### 3.2 数据初步查看与操作
在导入数据后,需要对数据进行初步查看和操作,以了解数据的基本情况。以下是一些常见的操作:
- **查看数据基本信息**:使用 `info()` 方法查看数据的基本信息,包括列名、数据类型、缺失值情况等。
```python
print(csv_data.info())
```
- **查看数据集行数和列数**:使用 `shape` 属性查看数据的行数和列数。
```python
rows, columns = csv_data.shape
```
- **获取数据集行数**:使用 `len()` 函数获取数据的行数。
```python
rows = len(csv_data)
```
- **查看数据集列名**:使用 `columns` 属性查看数据的列名。
```python
print(csv_data.columns)
```
- **查看数据集前几行**:使用 `head()` 方法查看数据的前几行。
```python
print(csv_data.head().to_csv(sep='\t', na_rep='nan'))
```
- **查看数据集后几行**:使用 `tail()` 方法查看数据的后几行。
```python
print(csv_data.tail().to_csv(sep='\t', na_rep='nan'))
```
### 3.3 数据选择与组织
在数据初步查看后,可能需要选择和组织数据,以满足特定的分析需求。以下是一些常见的操作:
- **选择列**:使用列名或列索引选择特定的列。
```python
# 选择单列
single_column = csv_data['column_name']
# 选择多列
multiple_columns = csv_data[['column1', 'column2']]
```
- **选择行**:使用条件语句或索引选择特定的行。
```python
# 选择满足条件的行
selected_rows = csv_data[csv_data['column_name'] > 10]
```
### 3.4 数据统计分析
在数据选择和组织后,可以进行一些统计分析,以了解数据的分布和特征。以下是一些常见的统计分析操作:
- **生成分类变量的频率**:使用 `value_counts()` 方法生成分类变量的频率。
```python
categorical_frequencies = csv_data['categorical_column'].value_counts()
print(categorical_frequencies)
```
- **生成连续变量的摘要统计信息**:使用 `describe()` 方法生成连续变量的摘要统计信息。
```python
continuous_summary = csv_data['continuous_column'].describe()
print(continuous_summary)
```
### 3.5 数据可视化
数据可视化是数据清洗和分析过程中的重要环节,通过可视化可以直观地了解数据的分布和特征。以下是一些常见的可视化方法:
| 可视化方法 | 适用场景 |
| ---- | ---- |
| 直方图 | 查看连续变量的分布 |
| 箱线图 | 识别连续变量的异常值 |
| 分组箱线图 | 发现特定组中的异常值 |
| 小提琴图 | 同时查看分布形状和异常值 |
| 散点图 | 查看双变量关系 |
| 折线图 | 查看连续变量的趋势 |
| 热力图 | 基于相关矩阵展示变量之间的相关性 |
#### 3.5.1 直方图示例
```python
import matplotlib.pyplot as plt
# 绘制直方图
plt.hist(csv_data['continuous_column'], bins=10)
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.title('Histogram of Continuous Column')
plt.show()
```
#### 3.5.2 箱线图示例
```python
# 绘制箱线图
plt.boxplot(csv_data['continuous_column'])
plt.ylabel('Value')
plt.title('Boxplot of Continuous Column')
plt.show()
```
### 3.6 数据清洗操作
在数据查看、选择、统计分析和可视化后,可能需要进行一些数据清洗操作,以处理缺失值、异常值等问题。以下是一些常见的数据清洗操作:
- **识别缺失值**:使用 `isnull()` 方法识别缺失值。
```python
missing_values = csv_data.isnull()
print(missing_values.sum())
```
- **处理缺失值**:可以使用 `dropna()` 方法删除包含缺失值的行或列,也可以使用 `fillna()` 方法填充缺失值。
```python
# 删除包含缺失值的行
cleaned_data = csv_data.dropna()
# 填充缺失值
filled_data = csv_data.fillna(0)
```
- **识别异常值**:可以使用统计方法(如 Z 分数、四分位距等)或机器学习方法(如 Isolation Forest 等)识别异常值。
```python
from scipy import stats
import numpy as np
# 使用 Z 分数识别异常值
z_scores = np.abs(stats.zscore(csv_data['continuous_column']))
outliers = csv_data[z_scores > 3]
print(outliers)
```
### 3.7 数据聚合与合并
在数据清洗后,可能需要对数据进行聚合和合并操作,以满足特定的分析需求。以下是一些常见的聚合和合并操作:
- **数据聚合**:使用 `groupby()` 方法对数据进行分组,并使用聚合函数(如 `sum()`、`mean()` 等)进行聚合。
```python
# 按分类变量分组并计算连续变量的总和
grouped_data = csv_data.groupby('categorical_column')['continuous_column'].sum()
print(grouped_data)
```
- **数据合并**:使用 `merge()` 方法或 `concat()` 方法对数据进行合并。
```python
# 合并两个 DataFrame
merged_data = pd.merge(df1, df2, on='common_column')
```
### 3.8 数据整理与重塑
数据整理与重塑是将数据转换为适合分析的格式的过程。以下是一些常见的数据整理与重塑操作:
- **删除重复行**:使用 `drop_duplicates()` 方法删除重复行。
```python
unique_data = csv_data.drop_duplicates()
```
- **数据重塑**:可以使用 `stack()`、`melt()`、`unstack()` 和 `pivot()` 等方法对数据进行重塑。
```python
# 将数据从宽格式转换为长格式
melted_data = pd.melt(csv_data, id_vars=['id_column'], value_vars=['column1', 'column2'])
```
### 3.9 自动化数据清洗
为了提高数据清洗的效率和可重复性,可以使用用户定义的函数和类来自动化数据清洗过程。以下是一个简单的示例:
```python
def get_first_look(data):
print(data.info())
print(data.head())
# 使用自定义函数查看数据
get_first_look(csv_data)
```
## 4. 总结
数据清洗是一个复杂而重要的过程,涉及到数据导入、查看、选择、统计分析、可视化、清洗、聚合、合并、整理和重塑等多个环节。通过使用 Python 及其相关生态系统工具,可以高效地完成这些任务。同时,为了提高数据清洗的效率和可重复性,可以使用用户定义的函数和类来自动化数据清洗过程。希望本文介绍的方法和技巧能够帮助你更好地进行数据清洗和分析。
## 5. 资源获取
- **示例代码文件**:可以从 GitHub 下载示例代码文件,链接为:https://github.com/PacktPublishing/Python-Data-Cleaning-Cookbook 。
- **彩色图像文件**:可以下载包含书中截图和图表彩色图像的 PDF 文件,链接为:https://static.packt-cdn.com/downloads/9781800565661_ColorImages.pdf 。
## 6. 反馈与交流
如果你对本文内容有任何疑问或建议,欢迎通过以下方式与我们联系:
- **一般反馈**:发送邮件至 [email protected] ,并在主题中提及相关内容。
- **错误报告**:访问 www.packtpub.com/support/errata ,选择相关内容并提交错误信息。
- **盗版举报**:如果发现任何非法副本,请将位置地址或网站名称发送至 [email protected] 。
- **成为作者**:如果你对写作或贡献书籍感兴趣,请访问 authors.packtpub.com 。
- **留下评论**:阅读和使用本文内容后,欢迎在购买平台留下评论,帮助其他读者做出决策。
# 用 Python 进行数据清洗:实用指南与技巧
## 7. 数据清洗各环节详细流程
为了更清晰地展示数据清洗的过程,下面用 mermaid 格式流程图来呈现各主要环节的顺序和关系:
```mermaid
graph LR
A[数据导入] --> B[数据初步查看与操作]
B --> C[数据选择与组织]
C --> D[数据统计分析]
D --> E[数据可视化]
E --> F[数据清洗操作]
F --> G[数据聚合与合并]
G --> H[数据整理与重塑]
H --> I[自动化数据清洗]
```
### 7.1 数据导入详细步骤
数据导入是整个数据清洗流程的起点,不同格式的数据导入步骤有所不同,具体如下:
| 数据格式 | 详细步骤 |
| ---- | ---- |
| CSV 文件 | 1. 导入 pandas 库;2. 使用 `read_csv` 函数并传入文件路径读取文件;3. 可选择查看数据的基本信息和前几行。示例代码如下:
```python
import pandas as pd
csv_data = pd.read_csv('example.csv')
print(csv_data.info())
print(csv_data.head())
``` |
| Excel 文件 | 1. 导入 pandas 库;2. 使用 `read_excel` 函数并传入文件路径读取文件;3. 可选择查看数据的基本信息和前几行。示例代码如下:
```python
import pandas as pd
excel_data = pd.read_excel('example.xlsx')
print(excel_data.info())
print(excel_data.head())
``` |
| SQL 数据库 | 1. 导入相应的数据库连接库(如 `sqlite3`)和 pandas 库;2. 建立数据库连接;3. 编写 SQL 查询语句;4. 使用 `read_sql` 函数执行查询并获取数据;5. 关闭数据库连接。示例代码如下:
```python
import sqlite3
import pandas as pd
conn = sqlite3.connect('example.db')
query = "SELECT * FROM table_name"
sql_data = pd.read_sql(query, conn)
conn.close()
print(sql_data.info())
print(sql_data.head())
``` |
| SPSS、Stata 和 SAS 数据 | 1. 导入 `pyreadstat` 库;2. 使用 `read_file` 函数读取相应格式的文件;3. 可选择查看数据的基本信息和前几行。示例代码如下:
```python
import pyreadstat
sas_data, meta = pyreadstat.read_sas7bdat('example.sas7bdat')
print(sas_data.info())
print(sas_data.head())
``` |
| R 数据 | 1. 导入 `rpy2` 库;2. 配置 R 环境;3. 加载 R 数据;4. 将 R 数据转换为 pandas DataFrame;5. 可选择查看数据的基本信息和前几行。示例代码如下:
```python
import rpy2.robjects as ro
from rpy2.robjects import pandas2ri
pandas2ri.activate()
r = ro.r
r['load']('example.RData')
r_data = r['data_name']
r_df = pandas2ri.ri2py(r_data)
print(r_df.info())
print(r_df.head())
``` |
| JSON 数据 | 1. 导入 pandas 库;2. 使用 `read_json` 函数读取 JSON 文件;3. 可选择查看数据的基本信息和前几行。示例代码如下:
```python
import pandas as pd
json_data = pd.read_json('example.json')
print(json_data.info())
print(json_data.head())
``` |
| 网页数据 | 1. 导入 `BeautifulSoup` 和 `pandas` 库;2. 使用 `requests` 库获取网页内容;3. 使用 `BeautifulSoup` 解析网页;4. 提取所需的数据;5. 将提取的数据转换为 pandas DataFrame;6. 可选择查看数据的基本信息和前几行。示例代码如下:
```python
import requests
from bs4 import BeautifulSoup
import pandas as pd
url = 'https://example.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# 假设提取表格数据
table = soup.find('table')
df = pd.read_html(str(table))[0]
print(df.info())
print(df.head())
``` |
### 7.2 数据初步查看与操作的更多应用
在数据初步查看与操作阶段,除了前面提到的基本操作,还可以进行更多深入的应用。例如,可以根据数据的列类型进行分类统计:
```python
import pandas as pd
csv_data = pd.read_csv('example.csv')
column_types = csv_data.dtypes
type_counts = column_types.value_counts()
print(type_counts)
```
### 7.3 数据选择与组织的复杂场景
在实际应用中,数据选择与组织可能会遇到更复杂的场景。比如,根据多个条件选择行:
```python
import pandas as pd
csv_data = pd.read_csv('example.csv')
selected_rows = csv_data[(csv_data['column1'] > 10) & (csv_data['column2'] < 20)]
print(selected_rows.head())
```
### 7.4 数据统计分析的拓展
数据统计分析除了生成频率和摘要统计信息,还可以进行相关性分析:
```python
import pandas as pd
csv_data = pd.read_csv('example.csv')
correlation_matrix = csv_data.corr()
print(correlation_matrix)
```
### 7.5 数据可视化的高级技巧
在数据可视化方面,除了基本的可视化方法,还可以进行子图绘制,同时展示多个可视化结果:
```python
import matplotlib.pyplot as plt
import pandas as pd
csv_data = pd.read_csv('example.csv')
fig, axes = plt.subplots(1, 2, figsize=(12, 6))
# 绘制直方图
axes[0].hist(csv_data['continuous_column'], bins=10)
axes[0].set_xlabel('Value')
axes[0].set_ylabel('Frequency')
axes[0].set_title('Histogram of Continuous Column')
# 绘制箱线图
axes[1].boxplot(csv_data['continuous_column'])
axes[1].set_ylabel('Value')
axes[1].set_title('Boxplot of Continuous Column')
plt.show()
```
### 7.6 数据清洗操作的综合应用
在处理缺失值和异常值时,可以结合多种方法进行综合处理。例如,先识别缺失值,然后根据不同情况进行填充,再识别异常值并进行处理:
```python
import pandas as pd
from scipy import stats
import numpy as np
csv_data = pd.read_csv('example.csv')
# 识别缺失值
missing_values = csv_data.isnull()
print(missing_values.sum())
# 处理缺失值
filled_data = csv_data.fillna(csv_data.mean())
# 识别异常值
z_scores = np.abs(stats.zscore(filled_data['continuous_column']))
outliers = filled_data[z_scores > 3]
print(outliers)
# 处理异常值,例如将异常值替换为均值
filled_data.loc[z_scores > 3, 'continuous_column'] = filled_data['continuous_column'].mean()
```
### 7.7 数据聚合与合并的复杂场景
在数据聚合与合并时,可能会遇到更复杂的场景,比如多表合并和多层次聚合。以下是一个多表合并的示例:
```python
import pandas as pd
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]})
df3 = pd.DataFrame({'key': ['A', 'C', 'E', 'G'], 'value3': [9, 10, 11, 12]})
merged_data = pd.merge(df1, df2, on='key', how='outer')
merged_data = pd.merge(merged_data, df3, on='key', how='outer')
print(merged_data)
```
### 7.8 数据整理与重塑的高级应用
数据整理与重塑可以进行更高级的操作,例如将数据从长格式转换为宽格式后再进行进一步的处理:
```python
import pandas as pd
data = {
'id': [1, 1, 2, 2],
'variable': ['A', 'B', 'A', 'B'],
'value': [10, 20, 30, 40]
}
df = pd.DataFrame(data)
pivoted_data = df.pivot(index='id', columns='variable', values='value')
print(pivoted_data)
```
### 7.9 自动化数据清洗的优化
为了使自动化数据清洗更加灵活和高效,可以对自定义函数进行优化,添加更多的参数和异常处理:
```python
import pandas as pd
def get_first_look(data, rows_to_show=5):
try:
print(data.info())
print(data.head(rows_to_show))
except Exception as e:
print(f"An error occurred: {e}")
# 使用自定义函数查看数据
csv_data = pd.read_csv('example.csv')
get_first_look(csv_data, rows_to_show=3)
```
## 8. 总结
通过上述详细的介绍,我们可以看到数据清洗是一个系统而复杂的过程,每个环节都紧密相连且相互影响。从数据导入开始,经过初步查看、选择、统计分析、可视化、清洗、聚合、合并、整理和重塑,最后到自动化数据清洗,每一步都需要根据数据的特点和分析的需求进行合理的操作。Python 及其相关生态系统工具为我们提供了强大的支持,使得我们能够高效地完成数据清洗任务。同时,不断优化和拓展数据清洗的方法和技巧,能够帮助我们更好地应对各种复杂的数据情况,为后续的数据分析和决策提供更可靠的数据基础。
## 9. 资源获取与反馈回顾
### 9.1 资源获取
- **示例代码文件**:可以从 GitHub 下载示例代码文件,链接为:https://github.com/PacktPublishing/Python-Data-Cleaning-Cookbook 。
- **彩色图像文件**:可以下载包含书中截图和图表彩色图像的 PDF 文件,链接为:https://static.packt-cdn.com/downloads/9781800565661_ColorImages.pdf 。
### 9.2 反馈与交流
如果你对本文内容有任何疑问或建议,欢迎通过以下方式与我们联系:
- **一般反馈**:发送邮件至 [email protected] ,并在主题中提及相关内容。
- **错误报告**:访问 www.packtpub.com/support/errata ,选择相关内容并提交错误信息。
- **盗版举报**:如果发现任何非法副本,请将位置地址或网站名称发送至 [email protected] 。
- **成为作者**:如果你对写作或贡献书籍感兴趣,请访问 authors.packtpub.com 。
- **留下评论**:阅读和使用本文内容后,欢迎在购买平台留下评论,帮助其他读者做出决策。
0
0
复制全文
相关推荐










