markdown
> 有人说它是Python版的Excel?格局打开啊朋友们!今天咱们把Pandas扒个底朝天,看完你会明白------这玩意儿能干的事,电子表格得哭晕在厕所(真的!)
## 一、先唠个嗑:Pandas到底何方神圣?
(敲黑板)官方定义咱就不念了!说人话:**Pandas就是Python里专门治"数据不服"的超级工具箱**。当你面对:
- 几十万行的销售数据想找规律?(头疼吧!)
- 十几个Excel表要合并清洗?(眼睛花了吧!)
- 乱七八糟的日期格式要统一?(血压上来了吧!)
这时候!Pandas啪地一声站出来:"放着我来!"(帅不帅?)它最牛的地方在于:**用几行代码干翻手动操作几小时的活儿**(亲测有效,省下时间喝奶茶不香吗?)
---
## 二、核武器登场:DataFrame & Series
### 举个接地气的栗子🌰
想象你开了家奶茶店(暴富梦启动!),你有张表记录每天卖了多少杯:
| 日期 | 奶茶品类 | 销量 | 单价(元) |
|------------|------------|------|----------|
| 2023-10-01 | 波霸奶茶 | 120 | 15 |
| 2023-10-01 | 芒果冰沙 | 85 | 18 |
| 2023-10-02 | 波霸奶茶 | 150 | 15 |
| ... | ... | ... | ... |
**在Pandas眼里,这就是个DataFrame!**(高级名字唬人吧?其实就是个带标签的二维表格)
```python
import pandas as pd # 江湖规矩,pd就是通关密语!
# 从字典创建DataFrame(超常用!)
data = {
"日期": ["2023-10-01", "2023-10-01", "2023-10-02"],
"奶茶品类": ["波霸奶茶", "芒果冰沙", "波霸奶茶"],
"销量": [120, 85, 150],
"单价(元)": [15, 18, 15]
}
df = pd.DataFrame(data)
print(df) # 看!整齐的表格出来了!
Series又是啥? 简单说就是DataFrame的**"一根筋"小弟**------它只认一列数据!比如df['销量']
就是一个Series,专注记录120, 85, 150...
三、Pandas骚操作大全(实战!实战!)
🛠️ 操作1:数据快照 - head()
& tail()
python
print(df.head(2)) # 瞅瞅前2行(默认5行)
print(df.tail(1)) # 看看最后1行(查岗专用!)
🔍 操作2:数据定位 - loc
vs iloc
(重点!易混!)
loc
:按标签选(更像人类思维)
python
# 选第1行所有列
print(df.loc[0, :])
# 选所有行的"奶茶品类"列(注意那个冒号!)
print(df.loc[:, "奶茶品类"])
# 组合拳:选第0、2行的"销量"和"单价"
print(df.loc[[0, 2], ["销量", "单价(元)"]])
iloc
:按位置选(机器思维,从0计数)
python
# 第1行(索引0),第3列(索引2)
print(df.iloc[0, 2]) # 输出:120
# 第1到2行(不含2),所有列
print(df.iloc[0:2, :])
🧹 操作3:数据清洗 - 处理缺失值(真实数据脏哭了!)
假设数据里有缺失(NaN):
python
# 检查哪些地方是空的
print(df.isnull())
# 大招1:直接删掉带NaN的行!(简单粗暴)
df_dropped = df.dropna()
# 大招2:用平均值填充NaN(温柔体贴)
df_filled = df.fillna(df.mean())
📊 操作4:统计之王 - groupby
(分组算账!)
灵魂问题:波霸奶茶总共卖了多少杯?赚了多少钱?
python
# 按奶茶品类分组,算销量总和
sales_by_type = df.groupby("奶茶品类")["销量"].sum()
print(sales_by_type)
# 分组后多维度聚合(超有用!)
result = df.groupby("奶茶品类").agg({
"销量": "sum", # 总销量
"单价(元)": "mean", # 平均单价
"日期": "count" # 销售天数
})
print(result)
🔗 操作5:表连接 - merge()
(Excel的VLOOKOUT弱爆了!)
假设你有另一张"成本表":
奶茶品类 | 成本(元) |
---|---|
波霸奶茶 | 6 |
芒果冰沙 | 8 |
python
# 合并两张表(自动按"奶茶品类"匹配)
cost_df = pd.DataFrame({"奶茶品类": ["波霸奶茶", "芒果冰沙"], "成本(元)": [6, 8]})
merged_df = pd.merge(df, cost_df, on="奶茶品类")
# 计算每笔订单利润!
merged_df["利润(元)"] = (merged_df["单价(元)"] - merged_df["成本(元)"]) * merged_df["销量"]
print(merged_df)
⏰ 操作6:时间序列处理(Pandas的王炸功能!)
把"日期"列变成正经时间类型:
python
df["日期"] = pd.to_datetime(df["日期"]) # 魔法转换!
# 按月份重采样(resample)计算月销量
monthly_sales = df.set_index("日期").resample("M")["销量"].sum()
print(monthly_sales)
# 提取星期几(周一=0, 周日=6)
df["星期"] = df["日期"].dt.dayofweek
print(df[df["星期"] == 5]) # 找出所有星期六的数据!
四、避坑指南(血泪教训!)
-
SettingWithCopyWarning
警告⚠️当你写
df2 = df[df['销量'] > 100]
后再修改df2
时经常蹦出来!
正确姿势: 用.copy()
显式拷贝!pythondf2 = df[df['销量'] > 100].copy() # 安全了!
-
内存爆炸💥
处理超大数据(几个G)时,Pandas可能吃光内存!
救星:- 用
dtype
指定数据类型省内存(如int8
代替int64
) - 试试
Dask
或Vaex
这类库(Pandas的分布式兄弟)
- 用
-
inplace=True
陷阱很多方法(如
df.dropna(inplace=True)
)直接修改原数据,不可逆!
忠告: 新手慎用!先不用inplace
,确认结果OK再赋值回去更安全。
五、Pandas学习路线(别瞎撞!)
- 基本功:
DataFrame/Series
创建、索引(loc/iloc
)、查看数据(head
/describe
/info
) - 数据清洗: 处理缺失值(
isnull
/dropna
/fillna
)、去重(drop_duplicates
)、替换值(replace
) - 变形术: 分组聚合(
groupby
+agg
)、表连接(merge
/join
)、透视表(pivot_table
) - 时间序列: 时间转换(
to_datetime
)、重采样(resample
)、滚动计算(rolling
) - IO大师: 读写CSV(
read_csv
/to_csv
)、Excel(read_excel
/to_excel
)、数据库(read_sql
)
终极建议:边学边怼真实数据! 从你的微信账单、运动APP导出数据开始玩,比看100遍教程都管用(亲测!)。
六、说点大实话(个人观点!)
Pandas学起来有点像学吉他------前三天手指头疼得想放弃,熬过去后突然就能弹歌了! 它初期学习曲线是有点陡(尤其索引那块),但一旦掌握核心操作,你会发现90%的数据任务都能用groupby
、merge
、loc
这几招搞定(真的不夸张)。
别再手动Ctrl+C/V了!让Pandas做你的数据苦力,省下时间去做更有价值的事(比如...再喝杯奶茶?) 🥤
(注:本文示例代码基于 pandas 2.x 版本,环境请使用官方Python发行版及合法渠道安装库)