Pandas 是 Python 数据分析的基石,提供了高效的 DataFrame 数据结构,能让你用几行代码完成数据读取、清洗、转换和聚合。这篇文章通过一系列可运行的代码示例,帮你快速上手 Pandas 的核心操作。
安装与导入
pip install pandas
import pandas as pd
import numpy as np
按照惯例,pandas 简写为 pd,后面的代码都基于这个约定。
DataFrame 的创建
DataFrame 是 Pandas 的核心数据结构,可以理解为一张带有行索引和列名的二维表。
从字典创建:
data = {
"name": ["张三", "李四", "王五", "赵六", "钱七"],
"age": [25, 30, 28, 35, 22],
"city": ["北京", "上海", "广州", "北京", "深圳"],
"salary": [15000, 25000, 18000, 30000, 12000]
}
df = pd.DataFrame(data)
print(df)
输出:
name age city salary
0 张三 25 北京 15000
1 李四 30 上海 25000
2 王五 28 广州 18000
3 赵六 35 北京 30000
4 钱七 22 深圳 12000
从列表创建:
rows = [
["张三", 25, "北京"],
["李四", 30, "上海"],
]
df2 = pd.DataFrame(rows, columns=["name", "age", "city"])
数据选取
# 选取单列,返回 Series
df["name"]
# 选取多列,返回 DataFrame
df[["name", "salary"]]
# 按行号切片
df[1:3] # 第1行到第2行(左闭右开)
# loc:基于标签选取
df.loc[0, "name"] # "张三"
df.loc[0:2, ["name", "age"]] # 第0~2行的 name 和 age 列
# iloc:基于位置选取
df.iloc[0, 0] # "张三"
df.iloc[0:2, 0:2] # 前2行,前2列
loc 和 iloc 的区别是初学者最容易混淆的地方:loc 使用标签(包含右端点),iloc 使用整数位置(不包含右端点)。
数据过滤
Pandas 支持布尔索引,写起来非常直观:
# 薪资大于 20000 的员工
high_salary = df[df["salary"] > 20000]
print(high_salary)
输出:
name age city salary
1 李四 30 上海 25000
3 赵六 35 北京 30000
# 多条件过滤:北京且薪资 > 20000
result = df[(df["city"] == "北京") & (df["salary"] > 20000)]
print(result)
输出:
name age city salary
3 赵六 35 北京 30000
注意多条件时每个条件要用括号括起来,且使用 &(与)、|(或),不能用 Python 的 and/or。
新增与修改列
# 新增一列:年终奖 = 薪资 * 2
df["bonus"] = df["salary"] * 2
# 修改列:薪资统一上调 10%
df["salary"] = df["salary"] * 1.1
# 基于条件赋值
df["level"] = np.where(df["salary"] > 20000, "高薪", "普通")
print(df[["name", "salary", "level"]])
输出:
name salary level
0 张三 16500.0 普通
1 李四 27500.0 高薪
2 王五 19800.0 普通
3 赵六 33000.0 高薪
4 钱七 13200.0 普通
分组聚合
groupby 是数据分析中最常用的操作之一:
# 按城市分组,计算平均薪资
city_avg = df.groupby("city")["salary"].mean()
print(city_avg)
输出:
city
上海 27500.0
北京 24750.0
广州 19800.0
深圳 13200.0
Name: salary, dtype: float64
# 多个聚合函数
city_stats = df.groupby("city")["salary"].agg(["mean", "max", "count"])
print(city_stats)
输出:
mean max count
city
上海 27500.0 27500.0 1
北京 24750.0 33000.0 2
广州 19800.0 19800.0 1
深圳 13200.0 13200.0 1
# 对不同列做不同的聚合
result = df.groupby("city").agg({
"salary": "mean",
"age": "max",
"name": "count"
})
result.columns = ["平均薪资", "最大年龄", "人数"]
print(result)
排序
# 按薪资降序排序
df_sorted = df.sort_values("salary", ascending=False)
print(df_sorted[["name", "salary"]])
输出:
name salary
3 赵六 33000.0
1 李四 27500.0
2 王五 19800.0
0 张三 16500.0
4 钱七 13200.0
缺失值处理
# 检测缺失值
df.isnull().sum()
# 填充缺失值
df["salary"].fillna(0, inplace=True)
# 删除含缺失值的行
df.dropna(subset=["name"], inplace=True)
读写 CSV
这是日常工作中最常见的 I/O 操作:
# 读取 CSV
df = pd.read_csv("employees.csv", encoding="utf-8")
# 常用参数
df = pd.read_csv(
"employees.csv",
encoding="utf-8",
sep=",", # 分隔符,默认逗号
header=0, # 第0行作为列名
usecols=["name", "salary"], # 只读取指定列
dtype={"salary": float}, # 指定列类型
na_values=["N/A", ""], # 识别为缺失值的字符串
)
# 写入 CSV
df.to_csv("output.csv", index=False, encoding="utf-8-sig")
utf-8-sig 编码可以让 Excel 正确识别中文,这是一个实用的小技巧。
实战:一个完整的小练习
把上面学到的操作串起来:
import pandas as pd
# 1. 创建数据
data = {
"product": ["手机", "笔记本", "平板", "手机", "笔记本", "平板"],
"region": ["华东", "华东", "华东", "华北", "华北", "华北"],
"sales": [1200, 800, 500, 900, 750, 300],
"profit": [240, 160, 75, 180, 150, 45]
}
df = pd.DataFrame(data)
# 2. 过滤:只看销售额 > 500 的记录
df_filtered = df[df["sales"] > 500]
# 3. 分组聚合:按产品统计总销售额和总利润
summary = df_filtered.groupby("product").agg({
"sales": "sum",
"profit": "sum"
})
# 4. 新增利润率列
summary["profit_rate"] = (summary["profit"] / summary["sales"] * 100).round(1)
# 5. 按利润率降序排序
summary = summary.sort_values("profit_rate", ascending=False)
print(summary)
输出:
sales profit profit_rate
product
手机 2100 420 20.0
笔记本 1550 310 20.0
平板 500 75 15.0
掌握了上面这些操作,已经能应对日常 80% 的数据处理需求。更进一步的内容,比如 merge 合并、pivot_table 透视表、时间序列处理等,后续再写。