Joyful Pandas的数据处理与分析:从入门到精通的完整指南

Joyful Pandas的数据处理与分析:从入门到精通的完整指南

【免费下载链接】joyful-pandas pandas中文教程 【免费下载链接】joyful-pandas 项目地址: https://gitcode.com/datawhalechina/joyful-pandas

引言:为什么选择Pandas进行数据处理?

在数据科学和数据分析领域,数据处理是至关重要的一环。你是否曾经遇到过这样的困境:

  • 面对海量的CSV、Excel数据文件,手动处理效率低下?
  • 需要快速进行数据清洗、转换和分析,但不知道从何入手?
  • 想要进行复杂的数据聚合和统计计算,但传统工具力不从心?

Pandas(Python Data Analysis Library)正是为了解决这些问题而生的强大工具。作为Python生态系统中最受欢迎的数据处理库,Pandas提供了高效、灵活的数据结构,让你能够轻松处理各种结构化数据。

本文将基于Datawhale的Joyful Pandas教程,带你全面掌握Pandas的核心功能和使用技巧。

一、Pandas基础:两大核心数据结构

1.1 Series:一维数据的完美容器

Series是Pandas中最基本的数据结构,可以理解为带标签的一维数组。让我们通过一个示例来理解:

import pandas as pd
import numpy as np

# 创建Series的多种方式
s1 = pd.Series([1, 3, 5, np.nan, 6, 8])
s2 = pd.Series({'a': 1, 'b': 2, 'c': 3})
s3 = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])

print("基本Series示例:")
print(s1)
print("\n字典创建Series:")
print(s2)
print("\n自定义索引Series:")
print(s3)

Series的核心属性:

属性描述示例
values数据值数组s.values
index索引对象s.index
dtype数据类型s.dtype
nameSeries名称s.name
shape形状s.shape

1.2 DataFrame:二维数据的强大处理工具

DataFrame是Pandas的核心数据结构,类似于Excel表格或SQL表,由行索引和列索引组成。

# 创建DataFrame的多种方式
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [25, 30, 35, 28],
    '城市': ['北京', '上海', '广州', '深圳'],
    '薪资': [15000, 20000, 18000, 22000]
}

df = pd.DataFrame(data)
print("基本DataFrame:")
print(df)
print("\nDataFrame信息:")
print(f"形状: {df.shape}")
print(f"列名: {df.columns.tolist()}")
print(f"索引: {df.index.tolist()}")

二、数据读写:多种格式无缝对接

2.1 文件读取实战

Pandas支持多种数据格式的读取,让我们看看如何操作:

# 读取CSV文件
df_csv = pd.read_csv('data/company.csv')
print("CSV文件前5行:")
print(df_csv.head())

# 读取Excel文件
df_excel = pd.read_excel('data/color.xlsx')
print("\nExcel文件前3行:")
print(df_excel.head(3))

# 读取TXT文件(自定义分隔符)
df_txt = pd.read_table('data/my_table_special_sep.txt', 
                       sep=' \|\\|\\|\\| ', engine='python')
print("\nTXT文件内容:")
print(df_txt)

2.2 高级读取技巧

# 带参数的读取示例
df_advanced = pd.read_csv('data/company.csv',
                         usecols=['公司名称', '行业', '市值'],  # 只读取指定列
                         nrows=100,                           # 只读取前100行
                         encoding='utf-8',                    # 指定编码
                         parse_dates=['上市日期'])            # 解析日期列

print("高级读取示例:")
print(df_advanced.info())

2.3 数据写入与导出

# 数据导出示例
df.to_csv('output/processed_data.csv', index=False, encoding='utf-8-sig')
df.to_excel('output/processed_data.xlsx', index=False)

# 导出为Markdown和LaTeX格式
print("Markdown格式:")
print(df.to_markdown())

print("\nLaTeX格式:")
print(df.to_latex())

三、数据清洗与预处理:打造高质量数据集

3.1 处理缺失值

# 创建包含缺失值的数据
data_with_na = {
    'A': [1, 2, np.nan, 4, 5],
    'B': [np.nan, 2, 3, np.nan, 5],
    'C': [1, 2, 3, 4, 5]
}
df_na = pd.DataFrame(data_with_na)

print("原始数据:")
print(df_na)

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

# 处理缺失值
df_filled = df_na.fillna({'A': df_na['A'].mean(), 'B': '未知'})
print("\n填充后的数据:")
print(df_filled)

3.2 数据去重与类型转换

# 数据去重
df_duplicates = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Alice', 'Charlie', 'Bob'],
    'age': [25, 30, 25, 35, 30]
})

print("去重前:")
print(df_duplicates)
print("\n去重后:")
print(df_duplicates.drop_duplicates())

# 数据类型转换
df_types = pd.DataFrame({
    'str_col': ['1', '2', '3'],
    'float_col': [1.1, 2.2, 3.3],
    'int_col': [1, 2, 3]
})

df_types['str_col'] = df_types['str_col'].astype(int)
print("\n类型转换后:")
print(df_types.dtypes)

四、数据筛选与排序:精准定位所需信息

4.1 条件筛选

# 创建示例数据
df_employees = pd.DataFrame({
    '姓名': ['张三', '李四', '王五', '赵六', '钱七'],
    '部门': ['技术部', '市场部', '技术部', '人事部', '市场部'],
    '薪资': [15000, 12000, 18000, 10000, 13000],
    '工龄': [3, 2, 5, 1, 4]
})

# 单条件筛选
tech_dept = df_employees[df_employees['部门'] == '技术部']
print("技术部员工:")
print(tech_dept)

# 多条件筛选
high_salary_tech = df_employees[
    (df_employees['部门'] == '技术部') & 
    (df_employees['薪资'] > 16000)
]
print("\n技术部高薪员工:")
print(high_salary_tech)

# 复杂条件筛选
senior_employees = df_employees[
    (df_employees['工龄'] >= 3) | 
    (df_employees['薪资'] > 14000)
]
print("\n资深或高薪员工:")
print(senior_employees)

4.2 数据排序

# 单列排序
sorted_by_salary = df_employees.sort_values('薪资', ascending=False)
print("按薪资降序排序:")
print(sorted_by_salary)

# 多列排序
sorted_multi = df_employees.sort_values(['部门', '薪资'], ascending=[True, False])
print("\n按部门升序、薪资降序排序:")
print(sorted_multi)

# 自定义排序
department_order = ['技术部', '市场部', '人事部']
df_employees['部门'] = pd.Categorical(df_employees['部门'], categories=department_order)
custom_sorted = df_employees.sort_values('部门')
print("\n自定义部门顺序排序:")
print(custom_sorted)

五、数据聚合与分组:深度洞察数据规律

5.1 分组统计

# 分组聚合示例
grouped = df_employees.groupby('部门')
print("各部门统计信息:")
print(grouped.agg({
    '薪资': ['mean', 'max', 'min', 'count'],
    '工龄': 'mean'
}))

# 多维度分组
print("\n各部门各工龄段薪资统计:")
if '工龄段' not in df_employees.columns:
    df_employees['工龄段'] = pd.cut(df_employees['工龄'], 
                                  bins=[0, 2, 4, 6],
                                  labels=['新手', '中级', '资深'])
    
multi_grouped = df_employees.groupby(['部门', '工龄段'])
print(multi_grouped['薪资'].mean().unstack())

5.2 透视表与交叉表

# 透视表示例
pivot_table = pd.pivot_table(df_employees,
                            values='薪资',
                            index='部门',
                            columns='工龄段',
                            aggfunc=['mean', 'count'],
                            fill_value=0)
print("薪资透视表:")
print(pivot_table)

# 交叉表示例
cross_tab = pd.crosstab(df_employees['部门'], 
                       df_employees['工龄段'],
                       values=df_employees['薪资'],
                       aggfunc='mean')
print("\n部门与工龄段交叉表:")
print(cross_tab)

六、时间序列处理:时序数据分析专家

6.1 时间序列基础

# 创建时间序列数据
dates = pd.date_range('20230101', periods=6)
ts_data = pd.DataFrame({
    '日期': dates,
    '销售额': np.random.randint(1000, 5000, 6),
    '客户数': np.random.randint(50, 200, 6)
})

print("时间序列数据:")
print(ts_data)

# 设置时间索引
ts_data.set_index('日期', inplace=True)
print("\n设置时间索引后:")
print(ts_data.head())

# 时间序列重采样
print("\n月度重采样(求平均):")
monthly_resampled = ts_data.resample('M').mean()
print(monthly_resampled)

6.2 时间序列分析

# 移动平均计算
ts_data['7天移动平均'] = ts_data['销售额'].rolling(window=2).mean()
ts_data['累计销售额'] = ts_data['销售额'].cumsum()

print("添加移动平均和累计值:")
print(ts_data)

# 时间差计算
if len(ts_data) > 1:
    ts_data['日环比'] = ts_data['销售额'].pct_change() * 100
    print("\n添加日环比增长率:")
    print(ts_data[['销售额', '日环比']])

七、高级技巧与性能优化

7.1 向量化操作

# 避免循环,使用向量化操作
df_employees['奖金'] = df_employees['薪资'] * 0.1  # 向量化乘法
df_employees['总包'] = df_employees['薪资'] + df_employees['奖金']

# 使用apply进行复杂操作
def calculate_bonus(row):
    if row['工龄'] > 3:
        return row['薪资'] * 0.15
    else:
        return row['薪资'] * 0.1

df_employees['智能奖金'] = df_employees.apply(calculate_bonus, axis=1)
print("智能奖金计算:")
print(df_employees[['姓名', '薪资', '工龄', '智能奖金']])

7.2 内存优化

# 查看内存使用情况
print("内存使用情况:")
print(df_employees.info(memory_usage='deep'))

# 优化数据类型
def optimize_dtypes(df):
    for col in df.columns:
        if df[col].dtype == 'object':
            # 对于类别型数据,转换为category节省内存
            if df[col].nunique() / len(df[col]) < 0.5:
                df[col] = df[col].astype('category')
        elif df[col].dtype == 'int64':
            # 向下转换整数类型
            df[col] = pd.to_numeric(df[col], downcast='integer')
        elif df[col].dtype == 'float64':
            # 向下转换浮点类型
            df[col] = pd.to_numeric(df[col], downcast='float')
    return df

df_optimized = optimize_dtypes(df_employees.copy())
print("\n优化后的内存使用:")
print(df_optimized.info(memory_usage='deep'))

八、实战案例:电商数据分析

让我们通过一个完整的案例来巩固所学知识:

# 模拟电商数据
np.random.seed(42)
n_records = 1000

ecommerce_data = pd.DataFrame({
    '订单ID': range(1, n_records + 1),
    '用户ID': np.random.randint(1001, 1100, n_records),
    '产品类别': np.random.choice(['电子产品', '服装', '家居', '食品'], n_records),
    '销售额': np.random.uniform(10, 500, n_records).round(2),
    '订单日期': pd.date_range('2023-01-01', periods=n_records, freq='H'),
    '支付方式': np.random.choice(['支付宝', '微信', '信用卡', '银联'], n_records),
    '是否退货': np.random.choice([0, 1], n_records, p=[0.95, 0.05])
})

print("电商数据概览:")
print(ecommerce_data.head())
print(f"\n数据形状: {ecommerce_data.shape}")

# 1. 销售分析
daily_sales = ecommerce_data.resample('D', on='订单日期')['销售额'].sum()
print("\n日销售额统计:")
print(daily_sales.head())

# 2. 品类分析
category_analysis = ecommerce_data.groupby('产品类别').agg({
    '销售额': ['sum', 'mean', 'count'],
    '是否退货': 'mean'
}).round(2)

category_analysis.columns = ['总销售额', '平均订单价', '订单数', '退货率']
print("\n品类分析:")
print(category_analysis)

# 3. 用户行为分析
user_analysis = ecommerce_data.groupby('用户ID').agg({
    '订单ID': 'count',
    '销售额': 'sum',
    '是否退货': 'sum'
}).rename(columns={
    '订单ID': '订单数',
    '销售额': '总消费额',
    '是否退货': '退货次数'
})

user_analysis['平均订单价值'] = (user_analysis['总消费额'] / user_analysis['订单数']).round(2)
print("\n用户分析前10名:")
print(user_analysis.sort_values('总消费额', ascending=False).head(10))

九、总结与最佳实践

9.1 核心要点总结

通过本文的学习,你应该掌握以下Pandas核心技能:

  1. 数据结构:深刻理解Series和DataFrame的区别与联系
  2. 数据读写:熟练处理CSV、Excel、TXT等多种格式
  3. 数据清洗:能够处理缺失值、重复值和异常值
  4. 数据筛选:使用布尔索引进行复杂条件查询
  5. 数据聚合:运用groupby进行分组统计和分析
  6. 时间序列:处理时间数据并进行重采样分析
  7. 性能优化:使用向量化操作和内存优化技巧

9.2 最佳实践指南

场景推荐做法避免做法
数据读取指定dtype、使用usecols筛选列一次性读取所有列
缺失值处理根据业务逻辑选择填充策略简单删除或填充
循环操作使用向量化操作或apply使用Python for循环
大数据处理使用分块读取(chunksize)一次性读取全部数据
内存优化使用category类型和向下转换保持默认数据类型

9.3 学习路线建议

graph TD
    A[Pandas基础] --> B[数据读写]
    A --> C[数据清洗]
    A --> D[数据筛选]
    
    B --> E[分组聚合]
    C --> E
    D --> E
    
    E --> F[时间序列]
    E --> G[数据可视化]
    
    F --> H[高级应用]
    G --> H
    
    H --> I[性能优化]
    H --> J[实战项目]

【免费下载链接】joyful-pandas pandas中文教程 【免费下载链接】joyful-pandas 项目地址: https://gitcode.com/datawhalechina/joyful-pandas

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值