2.2 Pandas数据分析

🎯 学习目标

通过通讯录管理器项目,掌握Pandas DataFrame操作和数据分析

📝 项目预览:通讯录管理器

我们将创建一个功能完整的联系人管理工具,通过这个项目学习:

  • DataFrame的创建和基本操作
  • 数据筛选和查询
  • 数据统计和分组分析
  • 文件的导入导出
  • 数据的增删改查

1. Pandas简介

什么是Pandas?

Pandas是Python中用于数据分析的核心库,提供了强大的DataFrame对象来处理表格数据。

为什么需要Pandas?

  • 表格数据处理:类似Excel,但更强大
  • 数据清洗:处理缺失值、重复数据
  • 数据聚合:分组统计、数据汇总
  • 时间序列:专门的时间数据处理功能

安装Pandas

pip install pandas

2. DataFrame基础

创建DataFrame

import pandas as pd

# 从字典创建DataFrame
data = {
    '姓名': ['张三', '李四', '王五'],
    '电话': ['13800138000', '13900139000', '13700137000'],
    '邮箱': ['zhang@email.com', 'li@email.com', 'wang@email.com']
}

df = pd.DataFrame(data)
print("通讯录数据:")
print(df)

DataFrame属性

print("数据形状:", df.shape)        # (3, 3) - 3行3列
print("列名:", list(df.columns))    # ['姓名', '电话', '邮箱']
print("索引:", df.index)            # RangeIndex(start=0, stop=3, step=1)
print("数据类型:\n", df.dtypes)

数据预览

print("前2条记录:")
print(df.head(2))

print("\n后1条记录:")
print(df.tail(1))

print("\n数据信息:")
print(df.info())

print("\n描述性统计:")
print(df.describe())

3. 数据选择和筛选

选择列

# 选择单列
names = df['姓名']
print("所有姓名:", names)

# 选择多列
contact_info = df[['姓名', '电话']]
print("\n联系信息:")
print(contact_info)

选择行

# 按位置选择
first_two = df.iloc[:2]  # 前2行
print("前2条记录:")
print(first_two)

# 按标签选择
specific = df.loc[0]  # 索引为0的行
print("\n第一条记录:")
print(specific)

条件筛选

# 单条件筛选
friends = df[df['姓名'].str.contains('三')]
print("姓名包含'三'的联系人:")
print(friends)

# 多条件筛选
complex_filter = df[(df['姓名'].str.startswith('张')) | (df['姓名'].str.startswith('李'))]
print("\n张姓或李姓联系人:")
print(complex_filter)

4. 数据操作

添加新数据

# 添加新行
new_contact = {'姓名': '赵六', '电话': '13600136000', '邮箱': 'zhao@email.com'}
df = pd.concat([df, pd.DataFrame([new_contact])], ignore_index=True)
print("添加后数据:")
print(df)

修改数据

# 修改特定值
df.loc[0, '电话'] = '13800138001'  # 修改第一条记录的电话
print("修改后数据:")
print(df)

# 批量修改
df['邮箱'] = df['邮箱'].str.replace('email.com', 'company.com')
print("\n批量修改邮箱:")
print(df)

删除数据

# 删除行
df_dropped = df.drop(0)  # 删除索引为0的行
print("删除第一条记录后:")
print(df_dropped)

# 删除列
df_no_email = df.drop('邮箱', axis=1)  # 删除邮箱列
print("\n删除邮箱列后:")
print(df_no_email)

5. 数据统计和分析

基本统计

# 数值列统计
print("描述性统计:")
print(df.describe())

# 非数值列统计
print("\n姓名统计:")
print(df['姓名'].value_counts())

print("\n唯一值统计:")
print(df.nunique())  # 每列的唯一值数量

分组统计

# 添加分组列
df['分组'] = ['朋友', '同事', '家人', '朋友']

# 按分组统计
group_stats = df.groupby('分组').agg({
    '姓名': 'count',      # 人数
    '电话': lambda x: list(x)  # 电话列表
})
print("分组统计:")
print(group_stats)

数据排序

# 按姓名排序
sorted_df = df.sort_values('姓名')
print("按姓名排序:")
print(sorted_df)

# 多列排序
multi_sorted = df.sort_values(['分组', '姓名'])
print("\n先按分组再按姓名排序:")
print(multi_sorted)

6. 文件操作

导出为CSV

# 导出数据
df.to_csv('contacts.csv', index=False, encoding='utf-8-sig')
print("数据已导出到 contacts.csv")

# 导出时选择列
df[['姓名', '电话']].to_csv('simple_contacts.csv', index=False)
print("简化版数据已导出")

从CSV导入

# 导入数据
imported_df = pd.read_csv('contacts.csv')
print("导入的数据:")
print(imported_df)

# 导入时指定参数
df_with_params = pd.read_csv('contacts.csv', encoding='utf-8-sig')
print("\n带参数导入:")
print(df_with_params.head())

7. 数据清洗

处理缺失值

# 创建有缺失值的数据
data_with_na = {
    '姓名': ['张三', '李四', None, '赵六'],
    '电话': ['13800138000', None, '13700137000', '13600136000'],
    '邮箱': ['zhang@email.com', 'li@email.com', 'wang@email.com', None]
}

df_na = pd.DataFrame(data_with_na)
print("有缺失值的数据:")
print(df_na)

# 检查缺失值
print("\n缺失值统计:")
print(df_na.isnull().sum())

# 填充缺失值
df_filled = df_na.fillna('未知')
print("\n填充后数据:")
print(df_filled)

处理重复值

# 创建有重复值的数据
data_duplicate = {
    '姓名': ['张三', '李四', '张三', '王五'],
    '电话': ['13800138000', '13900139000', '13800138000', '13700137000']
}

df_dup = pd.DataFrame(data_duplicate)
print("有重复值的数据:")
print(df_dup)

# 删除重复值
df_unique = df_dup.drop_duplicates()
print("\n去重后数据:")
print(df_unique)

8. 字符串操作

字符串方法

# 字符串操作
df['姓名大写'] = df['姓名'].str.upper()
df['姓名长度'] = df['姓名'].str.len()
df['邮箱域名'] = df['邮箱'].str.split('@').str[1]

print("字符串操作结果:")
print(df[['姓名', '姓名大写', '姓名长度', '邮箱', '邮箱域名']])

正则表达式

# 使用正则表达式提取信息
import re

df['电话前缀'] = df['电话'].str.extract(r'(\d{3})')
print("电话前缀提取:")
print(df[['电话', '电话前缀']])

📋 通讯录管理器完整代码解析

让我们看看项目中的关键代码:

import pandas as pd

def create_contact_dataframe():
    """创建通讯录DataFrame"""
    data = {
        '姓名': ['张三', '李四', '王五', '赵六'],
        '电话': ['13800138000', '13900139000', '13700137000', '13600136000'],
        '邮箱': ['zhang@email.com', 'li@email.com', 'wang@email.com', 'zhao@email.com'],
        '分组': ['朋友', '同事', '家人', '朋友']
    }
    
    df = pd.DataFrame(data)
    return df

def search_contacts(df, keyword):
    """搜索联系人"""
    mask = (df['姓名'].str.contains(keyword)) | \
           (df['电话'].str.contains(keyword)) | \
           (df['邮箱'].str.contains(keyword))
    
    results = df[mask]
    return results

def main():
    """主程序"""
    df = create_contact_dataframe()
    
    print("=== 通讯录管理器 ===")
    print("当前联系人:")
    print(df)
    
    # 搜索示例
    keyword = input("\n请输入搜索关键词: ")
    results = search_contacts(df, keyword)
    
    if len(results) > 0:
        print(f"找到 {len(results)} 个匹配的联系人:")
        print(results)
    else:
        print("没有找到匹配的联系人")

if __name__ == "__main__":
    main()

🎯 学习要点总结

  1. DataFrame创建pd.DataFrame() 从字典创建表格数据
  2. 数据选择df[列名], df.iloc[行号], df.loc[标签]
  3. 条件筛选df[条件], 使用布尔索引进行复杂查询
  4. 数据操作:添加、修改、删除行和列
  5. 统计分析describe(), value_counts(), groupby()
  6. 文件操作to_csv(), read_csv() 导入导出数据
  7. 数据清洗:处理缺失值、重复值
  8. 字符串操作:Pandas的字符串方法

💡 练习建议

  1. 运行代码:打开 code/第二阶段/2.2_通讯录管理器.py 体验功能
  2. 扩展功能:添加生日、地址、备注等字段
  3. 数据验证:实现电话号码、邮箱格式验证
  4. 高级搜索:支持模糊搜索、组合条件搜索
  5. 数据备份:实现自动备份和恢复功能

🚀 Pandas的优势

  1. 数据整合:轻松处理各种格式的数据
  2. 数据清洗:强大的数据预处理功能
  3. 数据分析:丰富的统计和聚合方法
  4. 可视化集成:与Matplotlib等库完美配合
  5. 性能优化:底层使用NumPy,性能优秀

🚀 实际应用场景

  1. 数据清洗:处理Excel、CSV文件中的数据
  2. 数据分析:业务数据统计和分析
  3. 数据转换:数据格式转换和整理
  4. 数据报告:自动生成数据报告
  5. 机器学习:数据预处理和特征工程

🚀 下一步

掌握Pandas后,你可以继续学习:

  • 2.3 数据可视化:用Matplotlib展示数据
  • 第三阶段:机器学习基础
  • 实际项目:用Pandas处理真实数据集

记住:Pandas是数据分析的瑞士军刀,熟练掌握它能让数据工作事半功倍!


学习愉快!多练习DataFrame操作,这是数据分析的核心技能!

« 上一篇 2.1 NumPy基础 下一篇 » 2.3 数据可视化