文章目录
敲黑板!!如果你还在用Excel手动处理几万行数据,或者写一堆for循环折腾CSV文件——停下!立刻!马上! Pandas就是为你准备的“数据瑞士军刀”!🛠️ (相信我,学完你会回来谢我的)
数据江湖的“万能钥匙”:DataFrame 和 Series
想象一下:Excel表格 + 数据库 + 超强计算引擎 = Pandas核心数据结构
💡 Series:你以为它是一维数组?不!它是带“身份证”的超级数组!
import pandas as pd
# 创建一个Series,自动配索引!酷毙了!
prices = pd.Series([29.9, 359.0, 199.0], name="商品价格", index=["鼠标", "键盘", "显示器"])
print(prices)
# 输出👇:
# 鼠标 29.9
# 键盘 359.0
# 显示器 199.0
# Name: 商品价格, dtype: float64
重点来了:prices["键盘"]
直接定位!prices.mean()
秒算均价!告别循环!(爽不爽?)
💡 DataFrame:这才是Pandas的“核武器”!!!
# 直接上实战!创建订单表
data = {
"订单号": ["A001", "A002", "A003"],
"商品": ["鼠标", "键盘", "显示器"],
"数量": [2, 1, 3],
"单价": [29.9, 359.0, 199.0]
}
df = pd.DataFrame(data)
# 瞬间开启上帝视角 👇
print(df.head(2)) # 看前2行,巨方便!
订单号 | 商品 | 数量 | 单价 | |
---|---|---|---|---|
0 | A001 | 鼠标 | 2 | 29.9 |
1 | A002 | 键盘 | 1 | 359.0 |
(看到没?原生支持表格打印!比print(list)
高级一万倍!)
🧹 数据清洗:从“脏乱差”到“白富美”的魔法
真实世界的数据有多坑? 缺失值、重复行、错误格式… 别怕!Pandas专治不服!
场景1:空值处理(Missing Data)
# 故意加个空值
df.loc[2, "单价"] = None
# 方案1:删!dropna()
clean_df = df.dropna() # 直接干掉空值行
# 方案2:填!fillna()
df["单价"].fillna(199.0, inplace=True) # 原地填充!inplace=True真香!
场景2:去除重复(Duplicates Killer)
# 手滑加了个重复订单
df = pd.concat([df, df.head(1)]) # 复制第一行
print(df[df.duplicated()]) # 揪出重复项!
df.drop_duplicates(inplace=True) # 一键清除!
场景3:数据类型矫正(Type Fixer)
# “数量”列被误读成字符串?不能忍!
df["数量"] = df["数量"].astype(int) # 强制转整数
# “日期”列是文本?秒变时间戳!
df["下单日期"] = ["2023-01-01", "2023-01-02", "2023-01-03"]
df["下单日期"] = pd.to_datetime(df["下单日期"]) # 原地变身日期类型!
🔍 数据查询:像侦探一样挖掘信息!
招式1:条件过滤(布尔索引 yyds!)
# 找出单价超过100的大订单
big_orders = df[df["单价"] > 100]
# 复合查询:键盘且数量>1 (虽然这里没有,但写法超重要!)
keyboard_orders = df[(df["商品"] == "键盘") & (df["数量"] > 1)]
招式2:神技query()
:像写SQL一样丝滑!
high_value = df.query("单价 > 100 and 数量 >= 2")
招式3:loc
和iloc
:精准定位“细胞级”数据!
# 用标签选:loc[行标签, 列标签]
print(df.loc[0, "商品"]) # 输出"鼠标"
# 用位置选:iloc[行索引, 列索引]
print(df.iloc[1, 2]) # 输出第二行第三列:1(键盘数量)
# 切片狂魔操作 👇
print(df.loc[0:2, ["商品", "单价"]]) # 选前3行,只看商品和单价列
📊 聚合统计:GroupBy——让数据自己说话!
终极灵魂问题:每种商品的总销售额是多少??GroupBy+Agg一步到位!
# 神之操作开始!
result = df.groupby("商品").agg(
总数量=("数量", "sum"), # 对“数量”列求和
平均单价=("单价", "mean"), # 计算单价均值
订单数=("订单号", "count") # 统计订单数
)
print(result)
商品 | 总数量 | 平均单价 | 订单数 |
---|---|---|---|
显示器 | 3 | 199.0 | 1 |
鼠标 | 2 | 29.9 | 1 |
键盘 | 1 | 359.0 | 1 |
(这表一出,老板直接给你加鸡腿!🍗)
🚀 效率加速:向量化操作 vs Python循环(性能对决!)
血泪教训:别用for
循环处理Pandas数据!慢到怀疑人生!
# ❌ 错误示范(龟速)
total_cost = 0
for i in range(len(df)):
total_cost += df["数量"][i] * df["单价"][i]
# ✅ Pandas正确姿势(闪电速度⚡)
df["总价"] = df["数量"] * df["单价"] # 向量化运算,秒出结果!
total_cost = df["总价"].sum()
原理:Pandas底层用C优化!整列计算比循环快几百倍!(亲测10万行数据,循环30秒 vs 向量化0.1秒!!)
🌟 实战:用Pandas解决真实问题(电商数据分析)
任务:分析销售数据,找出:
- 最畅销的商品类别
- 单笔订单平均销售额
- 每日销售趋势
# 假设df已包含日期、商品类别、销售额等列
# 1. 按类别聚合销量
top_category = df.groupby('类别')['数量'].sum().sort_values(ascending=False).head(1)
# 2. 计算客单价(平均订单金额)
avg_order_value = df.groupby('订单号')['总价'].sum().mean()
# 3. 按日统计销售额
daily_sales = df.set_index('下单日期').resample('D')['总价'].sum()
daily_sales.plot(title="每日销售趋势") # 无缝衔接Matplotlib画图!
💡 避坑指南(血泪经验总结!)
-
SettingWithCopyWarning
警告:- 遇到它别慌!通常是因为链式赋值(如
df[df['价格']>100]['折扣']=0.9
❌) - 正确做法:用
loc
一步到位df.loc[df['价格']>100, '折扣'] = 0.9
✅
- 遇到它别慌!通常是因为链式赋值(如
-
内存爆炸:
- 处理1GB+数据时,用
dtype
优化(例如category
类型处理文本) - 试试
chunksize
分块读取:pd.read_csv('超大文件.csv', chunksize=50000)
- 处理1GB+数据时,用
-
保存成果:
- 导出Excel:
df.to_excel("分析结果.xlsx", index=False)
(重要!index=False
避免多出索引列) - 存为CSV:
df.to_csv("clean_data.csv", encoding='utf-8-sig')
(支持中文Excel打开不乱码!)
- 导出Excel:
结语:Pandas不是库,是生产力核弹! 💥
别再手动折腾数据了!掌握Pandas后:
- 清洗10万行数据?几分钟搞定!
- 复杂聚合分析?几行代码出图!
- 周报自动化?脚本一键生成!
(偷偷说:我见过太多人用Excel折腾到凌晨,而Pandas使用者…早已下班喝咖啡去了 ☕)
立刻行动:打开Jupyter Notebook,复制文中的代码跑一遍!遇到报错?谷歌“Pandas + 你的报错”——99%的问题Stack Overflow都有解!(别问我是怎么知道的 😉)
终极忠告:Pandas的学习曲线?前陡后平!熬过前3小时,受益整个职业生涯!🚀