一、前言
在数据驱动的时代,python已成为数据分析领域的主流语言。而pandas作为python生态中最强大的数据处理库,提供了高效、灵活的数据结构,使得数据清洗、转换、分析变得异常简单。
本文将从基础概念出发,结合真实业务场景,带你一步步掌握pandas的核心用法。
二、环境准备
2.1 安装依赖
# 安装核心库 pip install pandas numpy openpyxl matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
2.2 导入库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 设置显示选项(防止列数过多时省略)
pd.set_option('display.max_columns', none)
pd.set_option('display.width', 1000)
三、核心数据结构
3.1 series对象
series是一维带标签数组,可以保存任意数据类型。
# 通过列表创建
s = pd.series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
print(s)
# 输出:
# a 10
# b 20
# c 30
# d 40
# dtype: int64
# 基本属性
print(f"索引: {s.index.tolist()}")
print(f"值: {s.values}")
print(f"数据类型: {s.dtype}")
3.2 dataframe对象
dataframe是二维表格型数据结构,是pandas最常用的对象。
# 通过字典创建
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, 30, 28, 35],
'城市': ['北京', '上海', '广州', '深圳'],
'薪资': [15000, 20000, 18000, 25000]
}
df = pd.dataframe(data)
print(df)
输出结果:
| 姓名 | 年龄 | 城市 | 薪资 | |
|---|---|---|---|---|
| 0 | 张三 | 25 | 北京 | 15000 |
| 1 | 李四 | 30 | 上海 | 20000 |
| 2 | 王五 | 28 | 广州 | 18000 |
| 3 | 赵六 | 35 | 深圳 | 25000 |
四、数据读取与查看
4.1 读取常见文件格式
# 读取csv文件
df_csv = pd.read_csv('data.csv', encoding='utf-8')
# 读取excel文件
df_excel = pd.read_excel('data.xlsx', sheet_name='sheet1')
# 读取json文件
df_json = pd.read_json('data.json')
4.2 快速查看数据
# 查看前5行
df.head()
# 查看后5行
df.tail(3)
# 查看数据形状(行数, 列数)
print(f"数据形状: {df.shape}")
# 查看数据类型
df.dtypes
# 查看统计摘要(仅数值列)
df.describe()
# 查看基本信息
df.info()
五、数据清洗实战
真实数据往往存在缺失值、重复值、异常值,清洗是分析前的必经之路。
5.1 处理缺失值
# 构造含缺失值的数据
df_missing = pd.dataframe({
'a': [1, 2, np.nan, 4],
'b': [5, np.nan, np.nan, 8],
'c': [9, 10, 11, 12]
})
# 查看缺失值分布
print(df_missing.isnull().sum())
# 删除含缺失值的行( thresh=2 表示至少保留2个非空值)
df_clean = df_missing.dropna(thresh=2)
# 填充缺失值
df_filled = df_missing.fillna({
'a': df_missing['a'].mean(), # 用均值填充
'b': 0 # 用0填充
})
5.2 处理重复值
# 删除完全重复的行 df_no_dup = df.drop_duplicates() # 按特定列去重(保留第一次出现的) df_no_dup = df.drop_duplicates(subset=['姓名'], keep='first')
5.3 数据类型转换
# 转换数据类型 df['年龄'] = df['年龄'].astype(int) # 字符串转日期 df['日期'] = pd.to_datetime(df['日期_str'], format='%y-%m-%d')
六、数据筛选与查询
6.1 条件筛选
# 单条件筛选:年龄大于28岁 df[df['年龄'] > 28] # 多条件筛选:北京且薪资大于18000 df[(df['城市'] == '北京') & (df['薪资'] > 18000)] # isin筛选:城市为北京或上海 df[df['城市'].isin(['北京', '上海'])]
6.2 loc与iloc定位
# loc按标签索引(闭区间) df.loc[0:2, ['姓名', '薪资']] # iloc按位置索引(左闭右开) df.iloc[0:2, 0:3] # 条件赋值:给北京员工加薪10% df.loc[df['城市'] == '北京', '薪资'] *= 1.1
6.3 query查询(推荐)
# 使用query进行复杂条件查询(代码更简洁)
df.query("城市 == '北京' and 薪资 > 15000")
七、分组统计与聚合
7.1 groupby分组
# 按城市分组,计算平均薪资
city_avg = df.groupby('城市')['薪资'].mean()
print(city_avg)
# 多列分组
result = df.groupby(['城市', '年龄'])['薪资'].agg(['mean', 'max', 'count'])
print(result)
7.2 透视表
# 创建透视表:查看各城市各年龄段的平均薪资
pivot = pd.pivot_table(
df,
values='薪资',
index='城市',
columns='年龄',
aggfunc='mean',
fill_value=0
)
print(pivot)
7.3 交叉表
# 统计各城市的人数分布 cross = pd.crosstab(df['城市'], df['年龄']) print(cross)
八、数据合并与重塑
8.1 数据合并
# 构造两个dataframe
df1 = pd.dataframe({'员工id': [1, 2, 3], '姓名': ['张三', '李四', '王五']})
df2 = pd.dataframe({'员工id': [1, 2, 4], '部门': ['技术', '产品', '运营']})
# 内连接(只保留两边都有的id)
merged = pd.merge(df1, df2, on='员工id', how='inner')
# 左连接(保留左边所有数据)
merged_left = pd.merge(df1, df2, on='员工id', how='left')
8.2 数据拼接
# 纵向拼接(行增加) df_concat = pd.concat([df1, df2], axis=0, ignore_index=true) # 横向拼接(列增加) df_concat_col = pd.concat([df1, df2], axis=1)
九、实战案例:电商销售分析
以下是一个完整的电商销售数据分析案例,涵盖从数据读取到可视化输出的全流程。
import pandas as pd
import matplotlib.pyplot as plt
# 1. 读取数据(模拟电商订单数据)
data = {
'订单id': [1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008],
'日期': ['2024-01-15', '2024-01-16', '2024-01-17', '2024-01-15',
'2024-01-18', '2024-01-16', '2024-01-19', '2024-01-15'],
'品类': ['手机', '电脑', '手机', '配件', '电脑', '配件', '手机', '配件'],
'地区': ['华东', '华北', '华东', '华南', '华北', '华东', '华南', '华南'],
'销售额': [5999, 8999, 6999, 199, 9999, 299, 7999, 99],
'数量': [1, 1, 1, 3, 1, 2, 1, 5]
}
orders = pd.dataframe(data)
orders['日期'] = pd.to_datetime(orders['日期'])
# 2. 数据清洗:检查缺失值
print("缺失值统计:")
print(orders.isnull().sum())
# 3. 业务分析
# 3.1 各品类总销售额
category_sales = orders.groupby('品类')['销售额'].sum().sort_values(ascending=false)
print("\n各品类销售额:")
print(category_sales)
# 3.2 各地区平均客单价
orders['客单价'] = orders['销售额'] / orders['数量']
region_avg = orders.groupby('地区')['客单价'].mean()
print("\n各地区平均客单价:")
print(region_avg)
# 3.3 每日销售趋势
daily_sales = orders.groupby('日期')['销售额'].sum()
# 4. 数据可视化
plt.rcparams['font.sans-serif'] = ['simhei'] # 中文显示
plt.rcparams['axes.unicode_minus'] = false
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
# 品类销售额柱状图
category_sales.plot(kind='bar', ax=axes[0], color='skyblue', edgecolor='black')
axes[0].set_title('各品类销售额对比', fontsize=14)
axes[0].set_ylabel('销售额(元)')
axes[0].tick_params(axis='x', rotation=45)
# 每日销售趋势折线图
daily_sales.plot(kind='line', ax=axes[1], marker='o', color='coral', linewidth=2)
axes[1].set_title('每日销售趋势', fontsize=14)
axes[1].set_ylabel('销售额(元)')
axes[1].grid(true, alpha=0.3)
plt.tight_layout()
plt.savefig('sales_analysis.png', dpi=150)
plt.show()
# 5. 输出分析结论
print("\n=== 分析结论 ===")
print(f"1. 最热销品类:{category_sales.index[0]},销售额 {category_sales.iloc[0]} 元")
print(f"2. 客单价最高地区:{region_avg.idxmax()},平均 {region_avg.max():.2f} 元")
print(f"3. 销售高峰日期:{daily_sales.idxmax().strftime('%y-%m-%d')},当日 {daily_sales.max()} 元")
运行结果分析:
各品类销售额: 手机 20997 电脑 18998 配件 597 name: 销售额, dtype: int64 各地区平均客单价: 华东 4365.67 华北 9499.00 华南 1656.33 name: 客单价, dtype: float64 === 分析结论 === 1. 最热销品类:手机,销售额 20997 元 2. 客单价最高地区:华北,平均 9499.00 元 3. 销售高峰日期:2024-01-15,当日 6297 元
十、总结与进阶路线
本文核心知识点回顾
| 操作类型 | 核心方法 | 使用场景 |
|---|---|---|
| 数据读取 | read_csv/read_excel | 加载外部数据 |
| 数据查看 | head/info/describe | 快速了解数据概况 |
| 缺失值处理 | dropna/fillna | 数据清洗 |
| 条件筛选 | []/loc/query | 提取目标数据 |
| 分组统计 | groupby/agg | 分类汇总分析 |
| 数据合并 | merge/concat | 多表关联 |
| 透视分析 | pivot_table | 多维度统计 |
进阶学习路线
- 时间序列分析:掌握
resample、shift、rolling等时序处理方法 - 高性能计算:学习
eval/query加速、cython优化、dask并行计算 - 数据可视化:结合matplotlib/seaborn/plotly制作交互式图表
- 实战项目:kaggle竞赛、天池大赛、企业真实业务分析
写在最后:pandas的学习曲线平缓但功能深邃。建议读者将本文代码逐行敲入jupyter notebook运行,修改参数观察输出变化,这是掌握pandas最高效的方式。如果在学习过程中遇到问题,欢迎在评论区留言交流。
以上就是python数据分析之pandas核心操作详解的详细内容,更多关于python pandas核心操作的资料请关注代码网其它相关文章!
发表评论