Python数据分析:Pandas入门

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列

lociloc 的区别是初学者最容易混淆的地方: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 透视表、时间序列处理等,后续再写。