大家好!今天我要和大家聊一聊Python数据分析中的"瑞士军刀"——pandas库。无论你是数据分析新手,还是想提升数据处理技能的Python爱好者,这篇文章都能帮你快速上手pandas,解决实际问题!
一、pandas是什么,为什么要学它?
pandas是Python中最强大的数据分析工具包之一,专为处理表格和时间序列数据而设计。如果你有Excel使用经验,可以把pandas看作是Python版的"超级Excel"。
为什么要学pandas?
处理大数据更高效:Excel打开几万行数据就卡顿,pandas能轻松处理百万级数据
自动化工作流程:重复的数据清洗和转换工作可以一键完成
强大的数据处理功能:筛选、分组、聚合、透视、合并数据等操作简单直观
与其他Python库无缝集成:配合NumPy、Matplotlib等库使用,数据分析全流程都能搞定
二、环境准备
首先,确保你已经安装了pandas:
# 如果还没安装,可以用pip安装
# pip install pandas
# 导入常用库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']
= False # 用来正常显示负号
# 查看pandas版本
print(pd.__version__)
三、pandas的核心数据结构
pandas有两种主要数据结构:Series(一维)和DataFrame(二维)。
1. Series:带标签的一维数组
pythonCopy# 创建Series
s = pd.Series([1, 3, 5, 7, 9], index=['a', 'b', 'c', 'd', 'e'])
print(s)
输出结果:
Copya 1
b 3
c 5
d 7
e 9
dtype: int64
Series可以理解为带索引的NumPy数组,或者单列的Excel表格。
2. DataFrame:带标签的二维表格
# 创建DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, 30, 22, 28],
'城市': ['北京', '上海',
'广州', '深圳'],
'工资': [10000, 20000, 15000, 25000]
}
df = pd.DataFrame(data)
print(df)
输出结果:
Copy 姓名 年龄 城市 工资
0 张三 25 北京 10000
1 李四 30 上海 20000
2 王五 22 广州 15000
3 赵六 28 深圳 25000
DataFrame是pandas最常用的数据结构,可以理解为Excel表格。
四、从文件中读取数据
实际工作中,我们通常需要从各种文件中读取数据。pandas支持多种格式:
# 读取CSV文件
df_csv = pd.read_csv('data.csv')
# 读取Excel文件
df_excel = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# 读取SQL查询结果
from sqlalchemy import create_engine
engine = create_engine('sqlite:///database.db')
df_sql = pd.read_sql('SELECT * FROM table_name', engine)
# 读取JSON文件
df_json = pd.read_json('data.json')
# 读取HTML表格
df_html = pd.read_html('http://example.com/table.html')[0]
如果你手头没有数据文件,pandas提供了一些示例数据集可以练习:
# 加载示例数据集
df = pd.DataFrame({
'日期': pd.date_range(start='2023-01-01', periods=6),
'部门': ['销售', '技术', '销售', '市场', '技术', '市场'],
'销售额': [100, 50, 130, 90, 60, 120],
'成本': [70, 30, 90, 60, 40, 80]
})
print(df)
五、数据探索和基本操作
拿到数据第一步,先来了解它的基本情况:
# 查看前几行数据
print(df.head())
# 查看基本信息
print(df.info())
# 查看统计摘要
print(df.describe())
# 查看形状(行数和列数)
print(df.shape)
# 查看列名
print(df.columns)
# 查看索引
print(df.index)
选择和过滤数据
# 选择单列
print(df['销售额'])
# 选择多列
print(df[['部门', '销售额']])
# 条件筛选
print
(df[df['销售额'] > 100])
# 组合条件
print(df[(df['销售额'] > 100) & (df['部门'] == '销售')])
# loc方法:基于标签索引
print(df.loc[1:3, ['部门', '销售额']])
# iloc方法:基于位置索引
print(df.iloc[1:3, [1, 2]])
数据排序
# 按销售额降序排序
print(df.sort_values('销售额', ascending=False))
# 按多列排序
print(df.sort_values(['部门', '销售额'], ascending=[True, False]))
六、数据清洗和处理
处理缺失值
# 检查缺失值
print(df.isnull().sum())
# 填充缺失值
df_filled = df.fillna({
'销售额': df['销售额'].mean(),
'成本': 0
})
# 删除含有缺失值的行
df_dropped = df.dropna()
删除重复值
# 检查重复行
print(df.duplicated().sum())
# 删除重复行
df_unique = df.drop_duplicates()
# 只根据特定列判断重复
df_unique_subset = df.drop_duplicates(subset=['部门'])
数据类型转换
# 查看数据类型
print(df.dtypes)
# 转换数据类型
df['销售额'] = df['销售额'].astype(float)
df['部门'] = df['部门'].astype('category') # 对于有限的分类值,使用category类型可以节省内存
重命名列
# 重命名列
df_renamed = df.rename(columns={
'销售额': 'revenue',
'成本': 'cost'
})
七、数据计算和转换
创建新列
# 基于现有列创建新列
df['利润'] = df['销售额'] - df['成本']
df['利润率'] = df['利润'] / df['销售额']
# 使用apply应用函数
def profit_category(
profit):
if profit > 50:
return '高'
elif profit > 20:
return '中'
else:
return '低'
df['利润等级'] = df['利润'].apply(profit_category)
聚合分析
# 按部门分组并计算统计值
group_result = df.groupby('部门').agg({
'销售额': ['sum', 'mean', 'max'],
'成本': ['sum', 'mean'],
'利润': 'sum'
})
print(group_result)
# 交叉表分析
cross_tab = pd.crosstab(
index=df['部门'],
columns=df['利润等级'],
values=df['销售额'],
aggfunc='sum'
)
print(cross_tab)
数据透视表
# 透视表
pivot_table = df.pivot_table(
values='销售额',
index='部门',
columns='利润等级',
aggfunc='sum',
fill_value=0
)
print(pivot_table)
八、时间序列数据处理
pandas在处理时间序列数据方面特别强大:
# 设置日期作为索引
df_time = df.set_index('日期')
# 按月重采样(汇总)
monthly = df_time.resample('M')['销售额'].sum()
print(monthly)
# 移动平均
ma7 = df_time['销售额'].rolling(window=3).mean()
# 按季度分组
quarterly = df_time.groupby(pd.Grouper(freq='Q'))['销售额'].sum()
print(quarterly)
九、数据可视化
pandas与matplotlib集成,可以直接绘制图表:
# 折线图
df.groupby('部门')['销售额'].sum().plot(kind='line')
plt.title('各部门销售额')
plt.show()
# 柱状图
df.plot(x='部门', y='销售额', kind='bar')
plt.title('各部门销售额')
plt.show()
# 饼图
df.groupby('部门')['销售额'].sum().plot(kind
='pie', autopct='%1.1f%%')
plt.title('销售额占比')
plt.show()
# 散点图
df.plot(x='销售额', y='利润', kind='scatter')
plt.title('销售额与利润关系')
plt.show()
十、实战案例:销售数据分析
让我们整合前面学到的知识,完成一个简单的销售数据分析案例:
# 修复matplotlib后端问题
import matplotlib
matplotlib.use('TkAgg') # 使用非交互式后端,适合脚本环境
import matplotlib.pyplot as plt
# 创建销售数据
import pandas as pd
import numpy as np
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 查看pandas版本
print(pd.__version__)
dates = pd.date_range('20230101', periods=100)
np.random.seed(42)
sales_data = pd.DataFrame({
'日期': dates,
'产品': np.random.choice(['A产品', 'B产品', 'C产品'], size=100),
'区域': np.random.choice(['华东', '华南', '华北', '西部'], size=100),
'销售量': np.random.randint(10, 100, size=100),
'单价': np.random.choice([99, 199, 299, 399], size=100),
})
# 计算销售额
sales_data['销售额'] = sales_data['销售量'] * sales_data['单价']
# 1. 数据清洗和准备
# 检查数据完整性
print("缺失值统计:")
print(sales_data.isnull().sum())
# 2. 探索性分析
# 基本统计量
print("基本统计量:")
print(sales_data.describe())
# 3. 按产品分析销售情况
product_sales = sales_data.groupby('产品').agg({
'销售量': 'sum',
'销售额': 'sum'
}).sort_values('销售额', ascending=False)
print("产品销售排名:")
print(product_sales)
# 4. 按区域分析销售情况
region_sales = sales_data.groupby('区域').agg({
'销售量': 'sum',
'销售额': 'sum'
}).sort_values('销售额', ascending=False)
print("区域销售排名:")
print(region_sales)
# 5. 时间趋势分析
# 设置日期为索引
sales_by_date = sales_data.set_index('日期')
# 按周统计
weekly_sales = sales_by_date.resample('W')['销售额'].sum()
print(
"周销售趋势:")
print(weekly_sales.head())
# 6. 交叉分析
# 产品在各区域的销售情况
product_region = sales_data.pivot_table(
values='销售额',
index='产品',
columns='区域',
aggfunc='sum',
fill_value=0
)
print("产品区域交叉分析:")
print(product_region)
# 7. 保存图表到文件,而不是显示
# 创建图表
plt.figure(figsize=(15, 10))
# 产品销售额占比饼图
plt.subplot(2, 2, 1)
product_sales['销售额'].plot(kind='pie', autopct='%1.1f%%')
plt.title('各产品销售额占比')
# 区域销售额柱状图
plt.subplot(2, 2, 2)
region_sales['销售额'].plot(kind='bar')
plt.title('各区域销售额')
# 周销售趋势图
plt.subplot(2, 1, 2)
weekly_sales.plot()
plt.title('周销售额趋势')
plt.tight_layout()
# 保存图表到文件而不是显示
plt.savefig('sales_analysis.png')
plt.show()
plt.close() # 关闭图表
# 8. 输出分析报告
print("\n===== 销售数据分析报告 =====")
print(f"总销售额: {sales_data['销售额'].sum():.2f}元")
print(f"销售最好的产品: {product_sales.index[0]}, 销售额: {product_sales['销售额'].iloc[0]:.2f}元")
print(f"销售最好的区域: {region_sales.index[0]}, 销售额: {region_sales['销售额'].iloc[0]:.2f}元")
恭喜你!通过这篇文章,你已经掌握了pandas的核心功能:
数据结构:Series和DataFrame
数据读取和预览
数据选择和过滤
数据清洗和处理
数据计算和转换
分组聚合和透视分析
时间序列处理
数据可视化
这只是pandas功能的冰山一角。随着你的实践越来越多,你会发现pandas几乎能满足所有数据分析需求。建议你准备一些真实数据集进行练习,比如:销售数据、网站访问日志、股票价格、疫情数据等。
数据分析是一个实践的过程,多动手才能真正掌握。希望这篇文章能帮你快速入门pandas,成为数据分析高手!
如果你喜欢这篇文章,别忘了点赞、收藏和分享给你的朋友!有任何问题,欢迎在评论区交流!
转发、收藏、在看,是对作者最大的鼓励!👏
对Python,AI,自动化办公提效,副业发展等感兴趣的伙伴们,扫码添加逍遥,限免交流群
备注【成长交流】