Pandas

1. pandas 简介

pandas 是 Python 中一个功能强大的数据分析和数据处理库,它提供了高性能、易用的数据结构(如 Series 和 DataFrame),方便进行数据的导入、清洗、转换、分析和可视化。pandas 广泛应用于金融、统计、科学计算等领域。

文档查阅:pandas 的官方文档非常详细,是学习和解决问题的好帮手。


2. 基本数据结构

2.1 Series

Series 是一种类似一维数组的对象,同时包含数据和索引。常用于表示单列数据。

import pandas as pd

# 创建一个 Series
data = [10, 20, 30, 40]
s = pd.Series(data, index=['a', 'b', 'c', 'd'])
print(s)

输出示例:

a    10
b    20
c    30
d    40
dtype: int64

2.2 DataFrame

DataFrame 是一种二维的表格型数据结构,每一列可以是不同的数据类型,类似于数据库中的表格。

# 创建一个 DataFrame
data = {
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35],
    'Score': [88, 92, 95]
}
df = pd.DataFrame(data)
print(df)

输出示例:

      Name  Age  Score
0    Alice   25     88
1      Bob   30     92
2  Charlie   35     95

3. 数据导入与导出

pandas 提供了非常多的数据导入导出方法,常用的包括:

3.1 读取 CSV 文件

# 读取 CSV 文件
df_csv = pd.read_csv('data.csv')

常用参数说明:

  • sep:指定分隔符,默认是逗号(,)。
  • header:指定文件的表头行号。
  • encoding:指定文件编码,如 utf-8gbk

3.2 写入 CSV 文件

# 将 DataFrame 写入 CSV 文件
df.to_csv('output.csv', index=False)

参数说明:

  • index:是否保存行索引,通常设为 False。

3.3 读取 Excel 文件

# 读取 Excel 文件
df_excel = pd.read_excel('data.xlsx', sheet_name='Sheet1')

3.4 写入 Excel 文件

# 写入 Excel 文件
df.to_excel('output.xlsx', index=False)

4. 数据查看和探索

在处理数据前,我们需要了解数据的基本情况。以下是一些常用方法:

4.1 查看前几行和后几行

print(df.head(5))  # 显示前 5 行,默认 head() 显示前 5 行
print(df.tail(5))  # 显示后 5 行

4.2 数据维度和基本信息

print(df.shape)  # 返回 (行数, 列数)
print(df.info())  # 显示 DataFrame 的信息(数据类型、缺失值等)
print(df.describe())  # 显示数值型数据的统计信息

5. 数据选择与索引

pandas 提供了多种方式来选取数据。

5.1 通过列名选择

# 选择单个列
age_series = df['Age']

# 选择多个列
subset = df[['Name', 'Score']]

5.2 使用 loc 和 iloc

  • .loc 用于通过标签选择数据(包括行和列)。
# 选择行索引为 0 到 1 的数据,并选取 'Name' 和 'Score' 列
subset_loc = df.loc[0:1, ['Name', 'Score']]
  • .iloc 用于通过位置选择数据。
# 选择第一行到第二行(不包含第三行),所有列
subset_iloc = df.iloc[0:2, :]

5.3 布尔索引

# 筛选年龄大于 28 的数据
filtered_df = df[df['Age'] > 28]

6. 数据处理与清洗

6.1 处理缺失值

缺失值(NaN)处理是数据清洗的重要部分。

# 查看缺失值情况
print(df.isnull().sum())

# 删除含有缺失值的行
df_drop = df.dropna()

# 填充缺失值(例如,用 0 填充)
df_fill = df.fillna(0)

6.2 重命名列名

df_renamed = df.rename(columns={'Name': '姓名', 'Age': '年龄'})

6.3 修改数据类型

# 将 'Age' 列转换为浮点型
df['Age'] = df['Age'].astype(float)

6.4 去重

# 删除重复行
df_unique = df.drop_duplicates()

6.5 排序

# 按年龄升序排序
df_sorted = df.sort_values(by='Age')

# 按多列排序,如先按年龄,再按分数降序排序
df_sorted_multi = df.sort_values(by=['Age', 'Score'], ascending=[True, False])

7. 数据聚合与分组

分组操作常用于数据的聚合和统计分析。

7.1 groupby

# 假设 DataFrame 中有一列 'Category',分组计算每组的平均分数
grouped = df.groupby('Category')['Score'].mean()
print(grouped)

groupby 常用方法:

  • mean():计算均值
  • sum():求和
  • count():计数
  • agg():支持多种聚合函数组合
# 使用 agg() 同时计算均值和标准差
grouped_stats = df.groupby('Category').agg({'Score': ['mean', 'std']})

7.2 pivot_table 数据透视表

数据透视表可以快速对数据进行汇总。

pivot = pd.pivot_table(df, values='Score', index='Category', columns='Gender', aggfunc='mean')
print(pivot)

8. 数据合并与连接

处理分散数据时,经常需要将多个 DataFrame 合并。

8.1 concat 合并

# 纵向拼接(按行合并)
df_concat = pd.concat([df1, df2], axis=0)

# 横向拼接(按列合并)
df_concat_columns = pd.concat([df1, df2], axis=1)

8.2 merge 合并

类似 SQL 的 join 操作,可以根据指定的键合并两个 DataFrame。

# 内连接:只保留两个 DataFrame 中共有的键
df_merged = pd.merge(df1, df2, on='id', how='inner')

# 左连接:以左侧 DataFrame 为主,右侧数据补充
df_left = pd.merge(df1, df2, on='id', how='left')

8.3 join 方法

DataFrame 自带的 join 方法也可以进行索引对齐的合并。

# 以 df1 的索引为主合并 df2
df_joined = df1.join(df2, how='left')

9. 时间序列处理

pandas 对时间序列数据有很好的支持。

9.1 日期时间解析

# 将字符串转换为 datetime 类型
df['date'] = pd.to_datetime(df['date'])

9.2 设置索引为日期

# 将日期列设置为索引
df.set_index('date', inplace=True)

9.3 重采样

# 按月计算均值
df_monthly = df.resample('M').mean()

10. 常用 API 总结示例

以下是一个综合示例,展示了如何使用 pandas 完成数据导入、处理、分组和导出操作。

import pandas as pd

# 1. 导入数据
df = pd.read_csv('sales_data.csv')

# 2. 数据清洗:去除缺失值
df.dropna(inplace=True)

# 3. 转换日期类型,并设置为索引
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)

# 4. 根据产品类别分组,计算总销售额和平均单价
grouped = df.groupby('Product').agg({
    'Sales': 'sum',
    'Price': 'mean'
}).reset_index()

# 5. 排序
grouped = grouped.sort_values(by='Sales', ascending=False)

# 6. 导出结果
grouped.to_csv('sales_summary.csv', index=False)

print("数据处理完成,汇总结果已保存。")

11. 补充技巧

  • 链式调用:为了让代码更简洁,可以使用链式调用。例如:

    df_clean = (
        pd.read_csv('data.csv')
        .dropna()
        .rename(columns=lambda x: x.strip().lower())
    )
    
  • 调试与检查:在处理数据过程中,多使用 head()tail()info() 等方法及时检查数据情况,避免后续操作出错。


12. 总结

pandas 提供了丰富的 API 和灵活的数据处理能力,本文介绍了从数据导入、查看、清洗、处理到数据聚合、合并以及时间序列处理等常用操作。掌握这些常用 API 后,你可以快速进行数据分析和数据科学项目开发。建议在实践中不断探索更多高级功能,例如多层索引、窗口函数、以及与其他库(如 NumPy、Matplotlib)的结合使用,从而进一步提升数据处理的效率和能力。

希望这份教程对你学习和使用 pandas 能有所帮助!