一步步学会使用Pandas进行数据处理
Pandas 数据处理完全指南:从入门到精通
Pandas 是 Python 数据科学生态中不可或缺的库,它提供了高性能、易用的数据结构和数据分析工具。无论是数据清洗、转换、分析还是可视化,Pandas 都能助您一臂之力。本文将带您深入了解 Pandas 的方方面面,助您从新手成长为 Pandas 数据处理专家。
1. Pandas 核心数据结构:Series 和 DataFrame
Pandas 的核心在于两种数据结构:Series 和 DataFrame。理解这两种数据结构是掌握 Pandas 的基础。
1.1 Series:一维带标签数组
Series 类似于一维数组,但每个元素都带有一个标签(索引)。可以将其看作是带有索引的列。
创建 Series:
```python
import pandas as pd
从列表创建
data = [10, 20, 30, 40, 50]
s = pd.Series(data)
print(s)
从字典创建
data = {'a': 10, 'b': 20, 'c': 30}
s = pd.Series(data)
print(s)
指定索引
s = pd.Series(data, index=['x', 'y', 'z', 'w', 'v'])
print(s)
```
Series 的属性:
values
: 获取 Series 的值(NumPy 数组)。index
: 获取 Series 的索引。dtype
: 获取 Series 的数据类型。
访问 Series 元素:
```python
通过位置访问
print(s[0])
通过标签访问
print(s['x'])
切片
print(s[1:4])
print(s['y':'w'])
```
1.2 DataFrame:二维带标签表格
DataFrame 是 Pandas 中最常用的数据结构,它类似于一个二维表格,由多个 Series 组成,每个 Series 代表一列,所有 Series 共享相同的索引。
创建 DataFrame:
```python
从字典创建
data = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 28],
'City': ['New York', 'London', 'Paris']}
df = pd.DataFrame(data)
print(df)
从列表的列表创建
data = [['Alice', 25, 'New York'],
['Bob', 30, 'London'],
['Charlie', 28, 'Paris']]
df = pd.DataFrame(data, columns=['Name', 'Age', 'City'])
print(df)
```
DataFrame 的属性:
values
: 获取 DataFrame 的值(二维 NumPy 数组)。index
: 获取 DataFrame 的行索引。columns
: 获取 DataFrame 的列索引。dtypes
: 获取 DataFrame 每列的数据类型。shape
: 获取 DataFrame 的形状(行数,列数)。
访问 DataFrame 元素:
```python
访问列
print(df['Name'])
print(df.Age) # 属性方式访问
访问行
print(df.loc[0]) # 通过标签访问
print(df.iloc[0]) # 通过位置访问
访问特定元素
print(df.loc[0, 'Name'])
print(df.iloc[0, 0])
切片
print(df[0:2]) # 行切片
print(df[['Name', 'Age']]) # 列切片
```
2. 数据读取与写入
Pandas 支持多种数据格式的读取和写入,让您轻松处理各种数据源。
2.1 读取 CSV 文件
```python
df = pd.read_csv('data.csv')
指定分隔符
df = pd.read_csv('data.tsv', sep='\t')
指定表头
df = pd.read_csv('data.csv', header=None) # 无表头
df = pd.read_csv('data.csv', header=0) # 第一行为表头
指定列名
df = pd.read_csv('data.csv', names=['col1', 'col2', 'col3'])
指定索引列
df = pd.read_csv('data.csv', index_col='ID')
读取部分列
df = pd.read_csv('data.csv', usecols=['col1', 'col3'])
读取部分行
df = pd.read_csv('data.csv', nrows=100)
```
2.2 读取 Excel 文件
```python
df = pd.read_excel('data.xlsx')
指定工作表
df = pd.read_excel('data.xlsx', sheet_name='Sheet2')
其他参数与 read_csv 类似
```
2.3 读取其他格式
Pandas 还支持读取其他格式的数据,如:
read_json()
: 读取 JSON 文件。read_html()
: 读取 HTML 表格。read_sql()
: 读取 SQL 数据库。read_parquet()
: 读取 Parquet 文件。read_feather()
: 读取 Feather 文件。
2.4 写入数据
```python
写入 CSV 文件
df.to_csv('output.csv', index=False) # 不写入索引
写入 Excel 文件
df.to_excel('output.xlsx', index=False)
其他写入函数与读取函数对应
```
3. 数据清洗与预处理
数据清洗和预处理是数据分析的重要环节,Pandas 提供了丰富的工具来处理缺失值、重复值、异常值和数据类型转换等问题。
3.1 缺失值处理
-
查找缺失值:
isnull()
: 返回一个布尔 DataFrame,指示哪些值是缺失值。notnull()
: 与isnull()
相反。isna()
: 与isnull()
相同。
-
处理缺失值:
dropna()
: 删除包含缺失值的行或列。fillna()
: 用指定的值填充缺失值。
```python
删除包含缺失值的行
df.dropna()
删除包含缺失值的列
df.dropna(axis=1)
用 0 填充缺失值
df.fillna(0)
用均值填充缺失值
df.fillna(df.mean())
用前一个值填充缺失值
df.fillna(method='ffill')
用后一个值填充缺失值
df.fillna(method='bfill')
```
3.2 重复值处理
-
查找重复值:
duplicated()
: 返回一个布尔 Series,指示哪些行是重复的。
-
删除重复值:
drop_duplicates()
: 删除重复的行。
```python
查找重复行
df.duplicated()
删除重复行
df.drop_duplicates()
根据指定列删除重复行
df.drop_duplicates(subset=['col1', 'col2'])
```
3.3 异常值处理
异常值通常需要根据具体业务场景进行处理,Pandas 提供了筛选和替换异常值的方法。
```python
筛选出 Age 大于 100 的行
df[df['Age'] > 100]
将 Age 大于 100 的值替换为 100
df.loc[df['Age'] > 100, 'Age'] = 100
```
3.4 数据类型转换
-
查看数据类型:
dtypes
: 查看每列的数据类型。info()
: 查看 DataFrame 的详细信息,包括数据类型。
-
转换数据类型:
astype()
: 转换数据类型。
```python
将 Age 列转换为字符串类型
df['Age'] = df['Age'].astype(str)
将 Date 列转换为日期类型
df['Date'] = pd.to_datetime(df['Date'])
```
4. 数据选择与过滤
Pandas 提供了强大的数据选择和过滤功能,让您能够轻松提取所需的数据。
4.1 基于标签的选择:loc
loc
属性用于基于标签选择数据。
```python
选择单行
df.loc[0]
选择多行
df.loc[0:2]
选择单列
df.loc[:, 'Name']
选择多列
df.loc[:, ['Name', 'Age']]
选择特定行和列
df.loc[0:2, ['Name', 'Age']]
基于条件选择
df.loc[df['Age'] > 25]
```
4.2 基于位置的选择:iloc
iloc
属性用于基于位置选择数据。
```python
选择单行
df.iloc[0]
选择多行
df.iloc[0:2]
选择单列
df.iloc[:, 0]
选择多列
df.iloc[:, [0, 2]]
选择特定行和列
df.iloc[0:2, [0, 2]]
```
4.3 布尔索引
布尔索引是一种强大的数据过滤方法,它使用布尔条件来选择数据。
```python
选择 Age 大于 25 的行
df[df['Age'] > 25]
选择 City 为 New York 或 London 的行
df[(df['City'] == 'New York') | (df['City'] == 'London')]
使用 isin() 方法
df[df['City'].isin(['New York', 'London'])]
```
4.4 字符串方法
Pandas 的字符串方法可以用于处理文本数据,例如筛选包含特定字符串的行。
```python
选择 Name 列包含 'A' 的行
df[df['Name'].str.contains('A')]
将 Name 列转换为大写
df['Name'] = df['Name'].str.upper()
```
5. 数据排序与排名
Pandas 可以对数据进行排序和排名。
5.1 排序
sort_values()
: 按值排序。sort_index()
: 按索引排序。
```python
按 Age 列升序排序
df.sort_values('Age')
按 Age 列降序排序
df.sort_values('Age', ascending=False)
按多列排序
df.sort_values(['Age', 'Name'])
按索引排序
df.sort_index()
```
5.2 排名
rank()
: 对数据进行排名。
```python
对 Age 列进行排名
df['Age_Rank'] = df['Age'].rank()
指定排名方法
df['Age_Rank'] = df['Age'].rank(method='average') # 平均排名
df['Age_Rank'] = df['Age'].rank(method='min') # 最小排名
df['Age_Rank'] = df['Age'].rank(method='max') # 最大排名
df['Age_Rank'] = df['Age'].rank(method='first') # 首次出现的排名
```
6. 数据分组与聚合
Pandas 的分组和聚合功能可以对数据进行分组计算,例如求和、平均值、计数等。
6.1 分组
groupby()
: 对数据进行分组。
```python
按 City 分组
grouped = df.groupby('City')
```
6.2 聚合
count()
: 计数。sum()
: 求和。mean()
: 平均值。median()
: 中位数。min()
: 最小值。max()
: 最大值。std()
: 标准差。var()
: 方差。describe()
: 描述性统计。
```python
计算每个城市的 Age 平均值
grouped['Age'].mean()
计算每个城市的 Age 总和和平均值
grouped['Age'].agg(['sum', 'mean'])
对多列进行聚合
grouped.agg({'Age': 'mean', 'Salary': 'sum'})
```
7. 数据合并与连接
Pandas 可以将多个 DataFrame 合并或连接在一起。
7.1 concat()
:沿轴连接
```python
沿行连接
pd.concat([df1, df2])
沿列连接
pd.concat([df1, df2], axis=1)
```
7.2 merge()
:基于列连接
```python
基于 'ID' 列连接
pd.merge(df1, df2, on='ID')
指定连接方式
pd.merge(df1, df2, on='ID', how='left') # 左连接
pd.merge(df1, df2, on='ID', how='right') # 右连接
pd.merge(df1, df2, on='ID', how='inner') # 内连接
pd.merge(df1, df2, on='ID', how='outer') # 外连接
基于多个列连接
pd.merge(df1, df2, on=['ID', 'Date'])
```
7.3 join()
:基于索引连接
```python
基于索引连接
df1.join(df2)
指定连接方式
df1.join(df2, how='left')
```
8. 数据透视表与交叉表
Pandas 提供了数据透视表和交叉表功能,可以对数据进行多维分析。
8.1 数据透视表:pivot_table()
```python
创建数据透视表
pd.pivot_table(df, values='Sales', index='Region', columns='Product', aggfunc='sum')
```
其中 aggfunc还可以接受列表参数。例如 aggfunc = ['sum','mean']
8.2 交叉表:crosstab()
```python
创建交叉表
pd.crosstab(df['Region'], df['Product'])
```
9. 时间序列数据处理
Pandas 对时间序列数据提供了强大的支持。
9.1 创建时间序列
```python
创建日期范围
dates = pd.date_range('2023-01-01', '2023-12-31')
创建时间序列
ts = pd.Series(range(len(dates)), index=dates)
```
9.2 时间索引
```python
获取特定日期的数据
ts['2023-01-01']
获取特定时间段的数据
ts['2023-01-01':'2023-01-31']
按月采样
ts.resample('M').mean()
按周采样
ts.resample('W').sum()
```
9.3 时间序列常用操作
shift()
: 移动时间序列。diff()
: 计算时间序列的差分。rolling()
: 计算滚动窗口统计量。
进阶之路
本文详细介绍了 Pandas 的核心功能和常用操作,为您打下了坚实的 Pandas 基础。但 Pandas 的功能远不止于此,以下是一些进阶主题,供您进一步探索:
- 多层索引: 使用多层索引可以处理更复杂的数据结构。
- 性能优化: 了解如何使用
.values
、NumPy
和Cython
来提高 Pandas 代码的性能。 - 数据可视化: Pandas 与 Matplotlib 和 Seaborn 等可视化库集成,可以轻松创建各种图表。
- 自定义函数: 使用
apply()
和transform()
方法可以应用自定义函数到 DataFrame 或 Series。 - Pandas 扩展: 了解 Pandas 的扩展库,如
pandas-gbq
(用于与 Google BigQuery 集成)和xarray
(用于处理多维数组)。
掌握 Pandas 需要不断的练习和实践。建议您结合实际数据分析项目,不断探索 Pandas 的各项功能,并查阅官方文档和社区资源,以提升您的 Pandas 技能。祝您在数据分析的道路上越走越远!