Day17: 数据魔法学院:用Pandas打开奇幻世界
目录
- 🧙♂️ 第一章:魔法基础 - 认识你的魔杖DataFrame
- 1.1 召唤你的第一只数据精灵
- 1.2 魔杖基本咒语
- 🧼 第二章:净化仪式 - 数据清洗大作战
- 2.1 处理混乱的数据
- 2.2 高级变形术
- 🔍 第三章:预言水晶球 - 数据洞察魔法
- 3.1 基础占卜术
- 3.2 高级预言术
- 🧪 第四章:魔药实验室 - 实战配方
- 4.1 魔药销售分析
- 4.2 数据融合魔法
- 🧠 第五章:智慧宝典 - 最佳实践指南
- 5.1 魔法师的自我修养
- 5.2 禁术警告
- 🎓 毕业考试:你的第一个分析项目
- 🌈 魔法师誓言
各位数据巫师学徒们!准备好你们的魔法棒(其实是键盘),我们要穿越到由混乱数据组成的魔法世界,用Pandas将原始数据点石成金!✨ 从今天起,你不再是数据的搬运工,而是数据的炼金术师!
🧙♂️ 第一章:魔法基础 - 认识你的魔杖DataFrame
1.1 召唤你的第一只数据精灵
import pandas as pd
from faker import Faker# 用魔法粉末生成虚拟数据
fake = Faker()
data_entries = []for _ in range(100):data_entries.append({'魔法师ID': fake.uuid4()[:8],'魔力值': round(fake.random.uniform(50, 200), 1),'擅长元素': fake.random_element(['火', '水', '风', '土']),'毕业院校': fake.company(),'注册日期': fake.date_this_decade()})# 铸造你的魔法卷轴(DataFrame)
mage_df = pd.DataFrame(data_entries)
print("第一份魔法契约已生成!")
print(mage_df.head(3))
1.2 魔杖基本咒语
# 选择特定魔法师
fire_mages = mage_df[mage_df['擅长元素'] == '火']# 添加新能力字段
mage_df['战斗力'] = mage_df['魔力值'] * 0.8 + 20# 魔法师排行榜
top_mages = mage_df.sort_values('魔力值', ascending=False).head(5)# 元素派系统计
element_counts = mage_df.groupby('擅长元素').size()
🧼 第二章:净化仪式 - 数据清洗大作战
2.1 处理混乱的数据
# 模拟脏数据
mage_df.loc[::10, '魔力值'] = None
mage_df.loc[::7, '毕业院校'] = '未知'# 缺失值处理魔法
clean_df = (mage_df.dropna(subset=['魔力值']) # 删除缺失魔力值的记录.fillna({'毕业院校': '神秘学院'}) # 填充未知院校.query('魔力值 < 190') # 排除异常值)# 数据格式转换
clean_df['注册日期'] = pd.to_datetime(clean_df['注册日期'])
2.2 高级变形术
# 魔法值分级
def classify_magic(power):if power < 100: return '见习'elif power < 150: return '中级'else: return '大魔导师'clean_df['等级'] = clean_df['魔力值'].apply(classify_magic)# 元素组合魔法(交叉分析)
element_power = pd.pivot_table(clean_df,values='魔力值',index='擅长元素',columns='等级',aggfunc='mean')
🔍 第三章:预言水晶球 - 数据洞察魔法
3.1 基础占卜术
# 描述性统计
magic_stats = clean_df['魔力值'].describe()# 元素分布比例
element_distribution = (clean_df['擅长元素'].value_counts(normalize=True).mul(100).round(1).astype(str) + '%')# 时间魔法(按月统计)
monthly_registration = (clean_df.groupby(clean_df['注册日期'].dt.to_period('M')).size())
3.2 高级预言术
import matplotlib.pyplot as plt# 魔力值分布图
plt.figure(figsize=(10, 6))
clean_df['魔力值'].plot(kind='hist',bins=20,color='purple',edgecolor='black')
plt.title('魔法师能力分布图')
plt.xlabel('魔力值')
plt.ylabel('人数')
plt.show()# 元素战力对比
(clean_df.groupby('擅长元素')['战斗力'].mean().sort_values().plot(kind='barh',color=['#ff9999','#66b3ff','#99ff99','#ffcc99'],title='各元素系平均战斗力'))
🧪 第四章:魔药实验室 - 实战配方
4.1 魔药销售分析
# 生成魔药销售数据
potion_data = {'订单ID': [f'ORD{1000+i}' for i in range(500)],'魔药类型': fake.random_elements(elements=['清醒药剂', '爱情魔药', '隐身药水'], length=500),'销售额': [round(fake.random.uniform(50, 500), 2) for _ in range(500)],'销售地区': fake.random_elements(elements=['北方大陆', '南方群岛', '西部荒漠'], length=500),'客户类型': fake.random_elements(elements=['个人', '批发商'], length=500)
}potion_df = pd.DataFrame(potion_data)# 添加日期数据
potion_df['销售日期'] = pd.date_range(start='2023-01-01', periods=500, freq='D')# 复杂分析示例
regional_sales = (potion_df.groupby(['销售地区', potion_df['销售日期'].dt.month]).agg({'销售额': ['sum', 'mean']}))
4.2 数据融合魔法
# 创建客户信息表
customers = pd.DataFrame({'订单ID': potion_df['订单ID'].sample(200),'客户年龄': [fake.random_int(18, 80) for _ in range(200)],'客户评分': [fake.random_int(1, 5) for _ in range(200)]
})# 数据连接
merged_df = pd.merge(potion_df, customers, on='订单ID', how='left')# 多层分析
age_group_sales = (merged_df.assign(年龄段=pd.cut(merged_df['客户年龄'],bins=[0, 25, 40, 55, 100],labels=['新生代', '中生代', '资深', '传奇'])).groupby(['年龄段', '魔药类型']).agg({'销售额': 'sum'}))
🧠 第五章:智慧宝典 - 最佳实践指南
5.1 魔法师的自我修养
# 保存你的魔法成果
clean_df.to_csv('clean_mage_data.csv', index=False)# 高效查询技巧
efficient_search = (clean_df.query('魔力值 > 120 & 擅长元素 == "火"').sort_values('注册日期').head(10))# 内存优化咒语
def optimize_memory(df):for col in df.columns:col_type = df[col].dtypeif col_type == 'float64':df[col] = df[col].astype('float32')elif col_type == 'int64':df[col] = df[col].astype('int32')return dfoptimized_df = optimize_memory(clean_df.copy())
5.2 禁术警告
# 危险操作示例(请勿模仿!)
unsafe_operation = (original_df.drop(columns=['重要字段']).fillna(0).replace({'特殊值': '未知'}))
🎓 毕业考试:你的第一个分析项目
- 分析不同魔法学院的战斗力差异
- 找出每月魔力增长最快的魔法师
- 预测下季度魔药销量趋势
- 创建交互式数据仪表板
- 设计自动化的数据清洗管道
# 通关秘籍:魔法快捷键
print("常用咒语列表:")
print(pd.options.display.max_columns = None) # 显示所有列
print(df.sample(5)) # 快速查看随机样本
print(df.nlargest(5, '魔力值')) # 排行榜前五
print(df.pipe(optimize_memory)) # 管道操作
🌈 魔法师誓言
- 永远备份你的原始数据
- 经常用.head()检查进度
- 善用链式方法保持代码整洁
- 警惕SettingWithCopyWarning警告
- 可视化是说服麻瓜的最好武器
“数据不会说谎,但需要优秀的魔法师来讲述真相。” —— 《Pandas魔法书》第127页