Pandas完全指南:从Series到DataFrame,掌握数据分析核心技能

一、 Pandas简介

1 什么是Pandas?

Pandas是Python编程语言中用于数据操纵和分析的强大开源库。它名字来源于"Panel Data"(面板数据),提供了快速、灵活、直观的数据结构,使得数据处理工作变得简单高效。

Pandas的三大核心优势:

· 数据处理能力强:轻松处理数万乃至数百万行的数据 · API设计直观:方法命名清晰,学习曲线平缓 · 生态整合完善:与NumPy、Matplotlib、Scikit-learn等库完美配合

2 安装与导入

bash 复制代码
pip install pandas numpy
python 复制代码
import pandas as pd
import numpy as np

print(f"Pandas版本: {pd.__version__}")

二、 Series对象:一维数据的基石

Series是Pandas中最基本的数据结构,可以理解为带标签的一维数组。

1 创建Series

python 复制代码
# 从列表创建
data = [10, 20, 30, 40, 50]
s1 = pd.Series(data)
print("从列表创建:")
print(s1)

# 从字典创建(自动使用键作为索引)
data_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
s2 = pd.Series(data_dict)
print("\n从字典创建:")
print(s2)

# 指定索引和名称
s3 = pd.Series([100, 200, 300], 
               index=['一月', '二月', '三月'],
               name='月度销售额')
print("\n指定索引和名称:")
print(s3)

2 Series的属性和方法

python 复制代码
# 创建示例Series
sales = pd.Series([1500, 2000, 1800, 2200, 1900],
                  index=['苹果', '香蕉', '橙子', '葡萄', '草莓'],
                  name='水果销售额')

print("Series基本信息:")
print(f"值: {sales.values}")
print(f"索引: {sales.index}")
print(f"名称: {sales.name}")
print(f"形状: {sales.shape}")
print(f"数据类型: {sales.dtype}")

# 常用统计方法
print(f"\n总和: {sales.sum()}")
print(f"平均值: {sales.mean():.2f}")
print(f"最大值: {sales.max()}")
print(f"最小值: {sales.min()}")
print(f"标准差: {sales.std():.2f}")

3 Series的索引和切片

python 复制代码
# 位置索引
print("第一个元素:", sales[0])
print("前三个元素:\n", sales[:3])

# 标签索引
print("香蕉的销售额:", sales['香蕉'])
print("多种水果:\n", sales[['苹果', '葡萄', '草莓']])

# 布尔索引
print("销售额大于2000的水果:\n", sales[sales > 2000])

三、 DataFrame对象:二维数据的王者

DataFrame是Pandas中最常用的数据结构,可以看作是由多个Series组成的字典。

1 创建DataFrame

python 复制代码
# 从字典创建
data = {
    '商品名称': ['苹果', '香蕉', '橙子', '葡萄', '草莓'],
    '销售额': [1500, 2000, 1800, 2200, 1900],
    '成本': [1000, 1200, 1100, 1500, 1300],
    '销量': [300, 500, 400, 350, 380]
}

df = pd.DataFrame(data)
print("创建的DataFrame:")
print(df)
print(f"\nDataFrame形状: {df.shape}")

# 从列表创建(指定列名)
data_list = [
    ['苹果', 1500, 1000, 300],
    ['香蕉', 2000, 1200, 500],
    ['橙子', 1800, 1100, 400]
]

df2 = pd.DataFrame(data_list, 
                   columns=['商品名称', '销售额', '成本', '销量'])
print("\n从列表创建的DataFrame:")
print(df2)

2 DataFrame的核心属性

python 复制代码
print("DataFrame基本信息:")
print(f"形状: {df.shape}")
print(f"列名: {df.columns.tolist()}")
print(f"索引: {df.index.tolist()}")
print(f"数据类型:\n{df.dtypes}")

print("\n前2行数据:")
print(df.head(2))

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

print("\n转置:")
print(df.T)

3 数据选择和操作

python 复制代码
# 选择列(返回Series)
print("销售额列:")
print(df['销售额'])

# 选择多列(返回DataFrame)
print("\n商品和销售额列:")
print(df[['商品名称', '销售额']])

# 使用loc按标签选择
print("\n选择前3行:")
print(df.loc[0:2])

print("\n选择特定行和列:")
print(df.loc[1:3, ['商品名称', '销售额']])

# 使用iloc按位置选择
print("\n按位置选择:")
print(df.iloc[0:2, 1:3])  # 前2行,第2-3列

# 条件筛选
print("\n销售额大于1800的商品:")
print(df[df['销售额'] > 1800])

print("\n复合条件筛选:")
print(df[(df['销售额'] > 1800) & (df['销量'] < 450)])

4 数据修改和计算

python 复制代码
# 添加新列
df['利润'] = df['销售额'] - df['成本']
df['利润率'] = (df['利润'] / df['销售额'] * 100).round(2)

print("添加新列后的DataFrame:")
print(df)

# 修改数据
df.loc[df['商品名称'] == '香蕉', '销售额'] = 2100
print("\n修改香蕉销售额后:")
print(df)

# 删除列
df_dropped = df.drop('成本', axis=1)
print("\n删除成本列后:")
print(df_dropped)

四、 使用Pandas读写文件

Pandas支持多种文件格式的读写,这是它在实际工作中最常用的功能之一。

1 读取CSV文件

python 复制代码
# 基本读取
df_csv = pd.read_csv('sales_data.csv')
print("CSV文件内容:")
print(df_csv.head())

# 带参数的读取
df_csv_advanced = pd.read_csv(
    'sales_data.csv',
    encoding='utf-8',        # 编码格式
    sep=',',                 # 分隔符
    header=0,                # 表头行
    index_col=0,             # 索引列
    na_values=['NULL', 'NA'] # 缺失值标识
)

2 读取Excel文件

python 复制代码
# 读取Excel
df_excel = pd.read_excel(
    'sales_data.xlsx',
    sheet_name='Sheet1',     # 工作表名
    header=0,                # 表头行
    usecols='A:D'           # 指定列范围
)

print("Excel文件内容:")
print(df_excel.head())

# 读取多个工作表
with pd.ExcelFile('sales_data.xlsx') as xls:
    df_sheet1 = pd.read_excel(xls, 'Sheet1')
    df_sheet2 = pd.read_excel(xls, 'Sheet2')

3 读取其他格式文件

python 复制代码
# 读取JSON文件
df_json = pd.read_json('sales_data.json')

# 读取HTML表格(需要安装html5lib, lxml)
# df_html = pd.read_html('http://example.com/table.html')

# 读取数据库
# import sqlite3
# conn = sqlite3.connect('database.db')
# df_sql = pd.read_sql_query('SELECT * FROM sales', conn)

4 写入文件

python 复制代码
# 写入CSV
df.to_csv('output_sales.csv', 
          index=False,       # 不保存索引
          encoding='utf-8-sig')

# 写入Excel
with pd.ExcelWriter('output_sales.xlsx') as writer:
    df.to_excel(writer, sheet_name='销售数据', index=False)
    
    # 可以写入多个工作表
    df_summary = df.describe()
    df_summary.to_excel(writer, sheet_name='数据摘要')

# 写入JSON
df.to_json('output_sales.json', orient='records', indent=2)

5 实战:完整的文件操作流程

python 复制代码
def process_sales_data(input_file, output_file):
    """
    完整的销售数据处理流程
    """
    try:
        # 读取数据
        if input_file.endswith('.csv'):
            df = pd.read_csv(input_file)
        elif input_file.endswith('.xlsx'):
            df = pd.read_excel(input_file)
        else:
            raise ValueError("不支持的文件格式")
        
        print(f"原始数据形状: {df.shape}")
        
        # 数据清洗
        df_clean = df.dropna()  # 删除缺失值
        df_clean = df_clean.drop_duplicates()  # 删除重复值
        
        # 数据计算
        df_clean['利润'] = df_clean['销售额'] - df_clean['成本']
        df_clean['利润率'] = (df_clean['利润'] / df_clean['销售额'] * 100).round(2)
        
        # 数据排序
        df_sorted = df_clean.sort_values('利润率', ascending=False)
        
        # 保存结果
        df_sorted.to_csv(output_file, index=False, encoding='utf-8-sig')
        
        print(f"处理完成!结果已保存至: {output_file}")
        print(f"处理后数据形状: {df_sorted.shape}")
        
        return df_sorted
        
    except Exception as e:
        print(f"处理过程中出错: {e}")
        return None

# 使用示例
# result_df = process_sales_data('input_sales.csv', 'processed_sales.csv')

五、 最佳实践和性能优化

1 内存优化

python 复制代码
def reduce_memory_usage(df):
    """减少DataFrame内存占用"""
    start_mem = df.memory_usage(deep=True).sum() / 1024**2
    print(f"初始内存占用: {start_mem:.2f} MB")
    
    for col in df.columns:
        col_type = df[col].dtype
        
        if col_type == 'object':
            df[col] = df[col].astype('category')
        elif col_type in ['int64', 'int32']:
            c_min = df[col].min()
            c_max = df[col].max()
            if c_min > 0:
                if c_max < 255:
                    df[col] = df[col].astype('uint8')
                elif c_max < 65535:
                    df[col] = df[col].astype('uint16')
    
    end_mem = df.memory_usage(deep=True).sum() / 1024**2
    print(f"优化后内存占用: {end_mem:.2f} MB")
    print(f"内存减少: {100 * (start_mem - end_mem) / start_mem:.1f}%")
    
    return df

2 错误处理

python 复制代码
def safe_read_csv(file_path, **kwargs):
    """安全的CSV文件读取函数"""
    default_kwargs = {
        'encoding': 'utf-8',
        'error_bad_lines': False,
        'warn_bad_lines': True
    }
    default_kwargs.update(kwargs)
    
    try:
        df = pd.read_csv(file_path, **default_kwargs)
        print(f"成功读取文件: {file_path}")
        return df
    except FileNotFoundError:
        print(f"文件不存在: {file_path}")
        return None
    except Exception as e:
        print(f"读取文件时出错: {e}")
        return None

六、 总结

通过本文的学习,我们系统掌握了:

  1. Pandas核心数据结构 · Series:一维带标签数组 · DataFrame:二维表格数据结构
  2. 数据操作技能 · 数据选择、切片、筛选 · 数据计算和转换 · 数据清洗和整理
  3. 文件读写能力 · 支持CSV、Excel、JSON等多种格式 · 灵活的参数配置 · 完整的数据处理流程
相关推荐
暴风鱼划水2 小时前
算法题(Python)数组篇 | 4.长度最小的子数组
python·算法·力扣
B站计算机毕业设计之家2 小时前
大数据python招聘数据分析预测系统 招聘数据平台 +爬虫+可视化 +django框架+vue框架 大数据技术✅
大数据·爬虫·python·机器学习·数据挖掘·数据分析
新手村领路人3 小时前
python打包成exe
python·打包
胡桃不是夹子3 小时前
torch和torchvision对应版本匹配官网下载
人工智能·python·深度学习
Q_Q19632884754 小时前
python+django/flask基于深度学习的个性化携程美食数据推荐系统
spring boot·python·深度学习·django·flask·node.js·php
胡耀超4 小时前
通往AGI的模块化路径:一个可能的技术架构(同时解答微调与RAG之争)
人工智能·python·ai·架构·大模型·微调·agi
清空mega4 小时前
从零开始搭建 flask 博客实验(常见疑问)
后端·python·flask
xier_ran4 小时前
关键词解释:DAG 系统(Directed Acyclic Graph,有向无环图)
python·算法
顾安r5 小时前
11.7 脚本网站 中国象棋
python·bash