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']。