一、 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
六、 总结
通过本文的学习,我们系统掌握了:
- Pandas核心数据结构 · Series:一维带标签数组 · DataFrame:二维表格数据结构
- 数据操作技能 · 数据选择、切片、筛选 · 数据计算和转换 · 数据清洗和整理
- 文件读写能力 · 支持CSV、Excel、JSON等多种格式 · 灵活的参数配置 · 完整的数据处理流程