Pandas简介及Python中的使用指南
什么是Pandas?
Pandas是一个开源的Python数据分析库,提供了高性能、易用的数据结构和数据分析工具。它建立在NumPy之上,使得在Python中进行数据操作和分析变得更加简单高效。Pandas这个名字来源于"Panel Data"(面板数据)和"Python Data Analysis"(Python数据分析)的组合。
Pandas的两个主要数据结构是:
- Series:一维数组,类似于Python中的列表,但带有索引功能
- DataFrame:二维表格型数据结构,可以看作是由多个Series组成的字典
安装Pandas
在开始使用Pandas之前,需要先安装它。可以使用pip进行安装:
pip install pandas
或者使用conda(如果你使用Anaconda发行版):
conda install pandas
Pandas基础使用示例
1. 创建DataFrame
import pandas as pd
# 从字典创建DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, 30, 35, 40],
'城市': ['北京', '上海', '广州', '深圳']
}
df = pd.DataFrame(data)
print(df)
# 从列表创建DataFrame
data_list = [
['张三', 25, '北京'],
['李四', 30, '上海'],
['王五', 35, '广州'],
['赵六', 40, '深圳']
]
df = pd.DataFrame(data_list, columns=['姓名', '年龄', '城市'])
2. 读取和写入数据
Pandas支持多种数据格式的读写:
# 读取CSV文件
df = pd.read_csv('data.csv', encoding='utf-8') # 指定编码格式
# 读取Excel文件
df = pd.read_excel('data.xlsx', sheet_name='Sheet1') # 指定工作表
# 写入CSV文件
df.to_csv('output.csv', index=False, encoding='utf-8-sig') # 避免中文乱码
# 写入Excel文件
df.to_excel('output.xlsx', index=False, sheet_name='数据')
# 支持的其他格式:JSON, SQL, HTML, Parquet等
3. 数据查看与选择
# 查看数据基本信息
print(df.info()) # 数据类型、内存使用等
print(df.describe()) # 数值列统计信息
# 查看前5行
print(df.head())
# 查看后3行
print(df.tail(3))
# 选择单列
ages = df['年龄'] # 或 df.年龄
# 选择多列
subset = df[['姓名', '城市']]
# 按条件筛选
young_people = df[df['年龄'] < 30]
# 使用loc和iloc选择数据
print(df.loc[1:3, ['姓名', '城市']]) # 按标签选择
print(df.iloc[1:3, 0:2]) # 按位置选择
4. 数据清洗与处理
# 处理缺失值
df.fillna(0, inplace=True) # 用0填充缺失值
df.dropna(inplace=True) # 删除包含缺失值的行
df['年龄'].fillna(df['年龄'].mean(), inplace=True) # 用平均值填充
# 重命名列
df.rename(columns={'姓名': 'name', '年龄': 'age'}, inplace=True)
# 添加新列
df['收入'] = [5000, 8000, 7000, 9000]
df['税后收入'] = df['收入'] * 0.9 # 直接计算
# 删除列
df.drop('城市', axis=1, inplace=True)
# 数据类型转换
df['年龄'] = df['年龄'].astype('float')
df['入职日期'] = pd.to_datetime(df['入职日期'])
# 去重处理
df.drop_duplicates(subset=['姓名'], keep='first', inplace=True)
5. 数据分组与聚合
# 按城市分组并计算平均年龄
city_avg_age = df.groupby('城市')['年龄'].mean()
# 多条件聚合
agg_results = df.groupby('城市').agg({
'年龄': ['mean', 'max', 'min', 'count'],
'收入': ['sum', 'mean', 'std']
})
# 多列分组
grouped = df.groupby(['城市', '年龄段'])['收入'].mean()
# 使用transform保持原始形状
df['城市平均收入'] = df.groupby('城市')['收入'].transform('mean')
6. 数据合并
# 创建第二个DataFrame
data2 = {
'姓名': ['张三', '李四', '钱七'],
'部门': ['技术部', '市场部', '财务部'],
'工号': [1001, 1002, 1003]
}
df2 = pd.DataFrame(data2)
# 合并两个DataFrame
merged_df = pd.merge(df, df2, on='姓名', how='left')
# 其他合并方式
concat_df = pd.concat([df, df2], axis=0) # 纵向拼接
join_df = df.set_index('姓名').join(df2.set_index('姓名'), how='inner')
7. 时间序列处理
import numpy as np
# 创建时间序列数据
date_rng = pd.date_range(start='2023-01-01', end='2023-01-10', freq='D')
time_series = pd.DataFrame(date_rng, columns=['date'])
time_series['value'] = np.random.randint(0, 100, size=(len(date_rng)))
# 设置日期索引
time_series.set_index('date', inplace=True)
# 按月份重采样
monthly_data = time_series.resample('M').mean()
# 时间偏移
time_series['prev_day'] = time_series['value'].shift(1)
# 滚动窗口计算
time_series['rolling_3d'] = time_series['value'].rolling(window=3).mean()
8. 数据可视化
Pandas内置了基于Matplotlib的简单绘图功能:
import matplotlib.pyplot as plt
# 绘制柱状图
df.plot.bar(x='姓名', y='收入', rot=45, title='员工收入分布')
plt.tight_layout()
plt.show()
# 绘制折线图
time_series.plot(y=['value', 'rolling_3d'], style=['-', '--'],
title='时间序列数据')
plt.show()
# 绘制箱线图
df.plot.box(column='收入', by='年龄段')
plt.show()
# 绘制散点图
df.plot.scatter(x='年龄', y='收入', s=100, alpha=0.6)
plt.show()
高级应用示例
1. 数据透视表
# 创建示例数据
sales_data = {
'日期': pd.date_range('2023-01-01', periods=100),
'产品': np.random.choice(['A', 'B', 'C'], 100),
'地区': np.random.choice(['东', '西', '南', '北'], 100),
'销售额': np.random.randint(100, 1000, 100),
'成本': np.random.randint(50, 500, 100)
}
sales_df = pd.DataFrame(sales_data)
# 创建数据透视表
pivot_table = pd.pivot_table(sales_df,
values=['销售额', '成本'],
index=['产品', '地区'],
columns=pd.Grouper(key='日期', freq='M'),
aggfunc={'销售额': np.sum, '成本': np.mean},
margins=True, # 添加总计
fill_value=0)
# 样式设置
styled_pivot = pivot_table.style.format('{:.0f}')\
.background_gradient(cmap='Blues')\
.highlight_max(color='lightgreen')
2. 多表连接
# 创建三个相关表
orders = pd.DataFrame({
'order_id': [1, 2, 3, 4],
'customer_id': [101, 102, 103, 104],
'order_date': pd.to_datetime(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04'])
})
customers = pd.DataFrame({
'customer_id': [101, 102, 103, 105],
'name': ['Alice', 'Bob', 'Charlie', 'David'],
'email': ['a@example.com', 'b@example.com', 'c@example.com', 'd@example.com']
})
order_items = pd.DataFrame({
'order_id': [1, 1, 2, 3, 3, 3, 4],
'product_id': [201, 202, 201, 203, 204, 205, 202],
'quantity': [1, 2, 1, 3, 1, 2, 1],
'unit_price': [100, 200, 100, 150, 300, 250, 200]
})
# 多表连接
merged_orders = pd.merge(
pd.merge(orders, customers, on='customer_id', how='left'),
order_items, on='order_id', how='left'
)
# 计算总价
merged_orders['total_price'] = merged_orders['quantity'] * merged_orders['unit_price']
# 多层索引
multi_index_df = merged_orders.set_index(['customer_id', 'order_id', 'product_id'])
3. 应用自定义函数
# 定义分类函数
def age_group(age):
if age < 30:
return '青年'
elif age < 50:
return '中年'
else:
return '老年'
# 应用函数创建新列
df['年龄段'] = df['年龄'].apply(age_group)
# 使用lambda函数
df['收入等级'] = df['收入'].apply(lambda x: '高' if x > 8000 else ('中' if x > 6000 else '低'))
# 向量化函数
@np.vectorize
def income_tax(income):
if income <= 5000:
return 0
elif income <= 8000:
return income * 0.1
else:
return income * 0.2
df['所得税'] = income_tax(df['收入'])
# 使用eval高效计算
df.eval('净收入 = 收入 - 所得税', inplace=True)
性能优化技巧
- 使用向量化操作:避免循环,使用Pandas内置方法
- 选择合适的数据类型:例如将字符串类别转换为category类型
- 使用query方法:对于复杂过滤条件
- 避免链式索引:使用loc或iloc进行明确索引
- 使用高效的数据格式:如parquet或feather
- 分块处理大数据:使用chunksize参数
# 优化示例
# 不推荐的方式(慢)
for idx in df.index:
df.loc[idx, '收入加倍'] = df.loc[idx, '收入'] * 2
# 推荐的方式(快)
df['收入加倍'] = df['收入'] * 2
# 使用category类型优化
df['城市'] = df['城市'].astype('category')
# 使用query方法
high_income = df.query('收入 > 8000 and 年龄 < 40')
# 使用eval表达式
df.eval('收入比 = 收入 / 收入.max()', inplace=True)
# 使用高效数据格式
df.to_parquet('data.parquet') # 比CSV读写更快
结语
Pandas是Python数据分析生态系统的核心组件,掌握它可以极大地提高数据处理效率。本文介绍了从基础到进阶的Pandas用法,包括:
- 数据结构与创建方法
- 数据读写与清洗技巧
- 数据选择与转换操作
- 分组聚合与透视分析
- 时间序列处理方法
- 数据可视化集成
- 高级数据操作技巧
- 性能优化建议
Pandas的功能远不止于此,还有更多高级特性如:
- 自定义扩展数据类型
- 与Dask集成处理大数据
- 与机器学习库的无缝集成
- 高级IO功能(读取数据库、网络数据等)
建议在实际项目中多加练习,逐步掌握Pandas的各种高级特性。可以参考官方文档和社区资源继续深入学习。