一步步学会使用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 的功能远不止于此,以下是一些进阶主题,供您进一步探索:

  • 多层索引: 使用多层索引可以处理更复杂的数据结构。
  • 性能优化: 了解如何使用 .valuesNumPyCython 来提高 Pandas 代码的性能。
  • 数据可视化: Pandas 与 Matplotlib 和 Seaborn 等可视化库集成,可以轻松创建各种图表。
  • 自定义函数: 使用 apply()transform() 方法可以应用自定义函数到 DataFrame 或 Series。
  • Pandas 扩展: 了解 Pandas 的扩展库,如 pandas-gbq(用于与 Google BigQuery 集成)和 xarray(用于处理多维数组)。

掌握 Pandas 需要不断的练习和实践。建议您结合实际数据分析项目,不断探索 Pandas 的各项功能,并查阅官方文档和社区资源,以提升您的 Pandas 技能。祝您在数据分析的道路上越走越远!

THE END