返回学习地图
pythonPhase B · 第 9

2.2 Pandas数据分析

DataFrame/Series/数据清洗/聚合/分组/可视化:Python数据分析利器完全指南

7 个章节·按类别展开/折叠
知识

Pandas是什么?——Python的Excel超级版

想象你有一张巨大的Excel表格,里面有几百万行的销售数据。在Excel里操作几百万行会卡到崩溃,而且很多数据分析操作要手动做。这时你需要一个更强大的工具——Pandas

Pandas是Python中最流行的数据分析库。你可以把它想象成Excel的超级增强版

Excel能做到的,Pandas都能做(而且更快、自动化);Excel做不到的(比如处理百万行数据、自动化重复操作、与其他程序集成),Pandas也能做。

Pandas的两个核心数据结构:

1. Series(序列)——一维带标签的数据。就像Excel中的一列,但每行都有一个标签(索引)。

示例:一个班级学生的分数 → Series(值:[85, 90, 78], 索引:["张三","李四","王五"])

2. DataFrame(数据框)——二维带标签的数据。就像整个Excel表格,有行和列。

示例:学生信息表 → DataFrame(列:["姓名","年龄","分数"], 行:多个学生)

重要概念:索引(Index)

索引就像是每一行的"身份证号"。可以是默认的0,1,2,...,也可以是自定义的(如学号、日期、名称)。索引让数据访问变得非常方便。

代码

DataFrame基本操作

代码

分组聚合(GroupBy)

代码

数据清洗实战

代码

高级操作:Pivot Table与Merge

实例

完整分析案例:从数据到洞察

实例

我们用一个完整的场景来练习:一家电商公司的订单数据。

原始数据(orders.csv):

date, product, qty, price, customer_city
2024-01-01, 手机, 2, 5000, 北京
2024-01-01, 耳机, 5, 200, 上海
2024-01-02, 手机, 1, 5000, 广州
2024-01-02, 电脑, 1, 8000, 北京
2024-01-03, 耳机, 3, 200, 上海
2024-01-03, 电脑, 2, 8000, 广州

步骤1:读取和数据清洗

import pandas as pd
df = pd.read_csv('orders.csv')
df['date'] = pd.to_datetime(df['date'])
df['revenue'] = df['qty'] * df['price']

步骤2:总体分析

total_revenue = df['revenue'].sum()  # 总销售额
avg_revenue = df['revenue'].mean()   # 平均每单销售额
print(f'总销售额: {total_revenue}')
print(f'平均每单: {avg_revenue}')

计算:手机 2×5000=10000, 耳机 5×200=1000, 手机 1×5000=5000, 电脑 1×8000=8000, 耳机 3×200=600, 电脑 2×8000=16000

总销售额 = 10000+1000+5000+8000+600+16000 = 40600

步骤3:按产品分析

product_analysis = df.groupby('product').agg({
    'qty': 'sum',
    'revenue': 'sum',
    'price': 'mean'
}).sort_values('revenue', ascending=False)
print(product_analysis)

步骤4:按城市分析

city_analysis = df.groupby('customer_city').agg({
    'revenue': 'sum',
    'qty': 'sum'
}).sort_values('revenue', ascending=False)
print(city_analysis)

步骤5:洞察

从分析可以得出:哪个产品卖得最多?哪个城市贡献了最多收入?数据会告诉你答案。

练习

练习题

练习

Q1:创建一个包含姓名、年龄、成绩的DataFrame,计算总平均成绩。

Q2:给定数据df,找出成绩最高的3位学生:df = pd.DataFrame({'name':['A','B','C','D','E'], 'score':[85,92,78,95,88], 'class':['1班','1班','2班','2班','1班']})

Q3:按班级分组计算平均成绩。

Q4:有一列有缺失值 [85, NaN, 90, NaN, 78],用均值填充。

Q5:orders表包含order_id, product, qty,prices表包含product, price。将两表合并得到每笔订单的金额。

查看答案

A1:df = pd.DataFrame({'name':['A','B','C'], 'age':[20,21,22], 'score':[85,90,88]})。平均成绩 = (85+90+88)/3 = 87.67。

A2:df.nlargest(3, 'score') → ['D':95, 'B':92, 'E':88]

A3:df.groupby('class')['score'].mean() → 1班=(85+92+88)/3=88.33, 2班=(78+95)/2=86.5

A4:均值=(85+90+78)/3=84.33。填充后 [85, 84.33, 90, 84.33, 78]

A5:merged = pd.merge(orders, prices, on='product')。merged['amount'] = merged['qty'] * merged['price']。