Pandas入门指南

总结整理了Pandas的基础语法,直接对应 LeetCode Pandas15 题的考点。

1. 数据结构与概览 (Data Structure & Inspection)

拿到数据的第一步,先看它长什么样。

  • 创建 DataFrame

    python 复制代码
    # 列表套列表创建
    df = pd.DataFrame(data=[[1, 'Alice'], [2, 'Bob']], columns=['id', 'name'])
  • 查看形状 (shape)

    python 复制代码
    # 返回一个元组 (行数, 列数)。
    rows, cols = df.shape
  • 筛选数据

    python 复制代码
    # 过滤与选择列 注意这里用了位运算|或者&,因为or和and只是针对单列,pandas里面用的是位运算
    # 然后选择列要用[[]]
    world[world['area'] >= 3000000 | world['population'] >= 25000000][['name', 'population', 'area']]
  • 预览数据 (head)

    python 复制代码
    df.head(3) # 默认看前 5 行,指定数字看前 N 行。

2. 数据选取 (Selection)

这里是容易混淆的地方,请记住口诀:loc 看标签(名字),iloc 看下标(位置)

  • loc (Label-based) :根据行/列的名称筛选。

    • 语法df.loc[行标签, 列标签]

    • 场景:比如你要选 name 为 'Alice' 的那一行的 'age' 列。

    python 复制代码
    # 筛选 'student_id' 为 101 的行,仅查看 'name' 列
    df.loc[df['student_id'] == 101, 'name']
  • iloc (Integer-based) :根据行/列的物理位置索引(从 0 开始)筛选。

    • 语法df.iloc[行索引, 列索引]

    • 场景:不管列名叫什么,我只想要第一行、第二列的数据。

    python 复制代码
    df.iloc[0, 1]  # 获取第1行、第2列的一个具体数值
    df.iloc[:3, :] # 获取前3行,所有列 (等同于 head(3))
  • **条件筛选:**condition满足的部分保留原值,剩余部分设置为0

    python 复制代码
        condition = (employees['employee_id'] % 2 == 1) & (~employees['name'].str.startswith('M'))
        employees['bonus'] = employees['salary'].where(condition, 0)
  • 常规条件筛选 (Boolean Indexing)

    python 复制代码
    # 选出 employee_id 等于 3 的所有列
    df[df['employee_id'] == 3]

3. 数据清洗 (Data Cleaning)

数据处理中最繁琐的步骤。

  • 删除重复行 (drop_duplicates)

    • 关键点解答 :如果 subset=['A', 'B'],逻辑是 AND (且)

    • 解释 :只有当一行数据的 'A' 列 'B' 列的值,与另一行完全一致时,才会被视为重复并删除。

    python 复制代码
    # 只有当 email 和 name 都一样时,才算重复行并删除
    # keep='first' 保留第一次出现的,删除后面出现的
    df.drop_duplicates(subset=['email', 'name'], keep='first')
  • 处理缺失值 (dropna / fillna)

    • 删除 (Drop)

    • 关键点解答 :如果 subset=['A', 'B'],逻辑是 OR (或)

    • 如果想实现"全部为空才删除":用how=all

      python 复制代码
      # 只有当 'name' 和 'email' 同时为缺失值时,才删除这一行
      df.dropna(subset=['name', 'email'], how='all')
    • 填充 (Fill)

      python 复制代码
      # 把 quantity 列里的 NaN 填补为 0
      df.fillna({'quantity': 0})
  • 修改列属性 (rename / astype)

    • 重命名

      python 复制代码
      # 把 id 改名为 student_id
      df.rename(columns={'id': 'student_id'})
    • 改类型

      python 复制代码
      # 把 grade 列里的字符串转为整数 (例如 "98.0" -> 98)
      df.astype({'grade': int})

4. 数据修改 (Modification)

在表中进行计算或修改内容。c

  • 创建/更新列

    • 直接赋值即可。如果列名存在则修改,不存在则新建。
    python 复制代码
    # 新建一个 bonus 列,值是 salary 的两倍
    df['bonus'] = df['salary'] * 2

5. 表格重塑 (Reshaping)

这三个函数决定了你能不能把数据变成想要的形状。

  • 连接 (merge)

    • 功能:合并两个表

    • 例子:suffixes代表如果同名,自动加上后缀,how用于表示不同的join

      python 复制代码
      # 1. 连接 Employee 表和 Department 表
      # left_on='departmentId' 对应 Employee 表,right_on='id' 对应 Department 表
      df = employee.merge(department, left_on='departmentId', right_on='id', suffixes=('_emp', '_dept'), how = 'inner')
  • 连结 (concat)

    • 功能:像堆积木一样,把两个表拼在一起。默认是上下拼接(增加行数)。

    • 例子

      python 复制代码
      # 把 df1 和 df2 上下拼成一个大表
      pd.concat([df1, df2])
  • 透视 (pivot) ------ 长表变宽表

    • 功能:把某一列里的"值"变成新的"列名"。通常用于看报表。

    • 例子:假设你有一张流水账表,想看每个月(index)不同城市(columns)的气温(values)。

      python 复制代码
      # 结果中:每一行是一个 month,每一列是一个 city,中间填的是 temperature
      df.pivot(index='month', columns='city', values='temperature')
  • 融合 (melt) ------ 宽表变长表

    • 功能pivot 的逆操作。把很多列名"折叠"进一列里。通常用于方便计算机处理数据。

    • 例子:把 'Quarter1', 'Quarter2' 这些列名折叠变成一个叫 'quarter' 的新列。

      python 复制代码
      report = report.melt(
          # id_vars: 指定需要保留作为标识符的列,这些列不会被"融化"
          # 在这里'product'列将保持不变,每行数据都会包含产品信息
          id_vars = ['product'], 
          
          # value_vars: 指定需要被"融化"的列,即从列名转换为列值的列
          # 这里将四个季度列转换为行数据
          value_vars = ["quarter_1", "quarter_2", "quarter_3", "quarter_4"],
          
          # var_name: 指定新列的列名,这个列将包含被融化列的原始列名
          # 这里新列将命名为"quarter",包含"quarter_1"、"quarter_2"等值
          var_name = "quarter",
          
          # value_name: 指定新列的列名,这个列将包含被融化列的原始值
          # 这里新列将命名为"sales",包含每个季度对应的销售额数据
          value_name = "sales"
      )

6. 字符串函数

python 复制代码
# 长度用.str 再加函数名的方法
return tweets[tweets['content'].str.len() > 15][['tweet_id']]

# startswith
condition = (employees['employee_id'] % 2 == 1) & (~employees['name'].str.startswith('M'))
employees['bonus'] = employees['salary'].where(condition, 0)

# str[0]取出的是一个series,因此还需要.str
users['name'] = users['name'].str[0].str.upper() + users['name'].str[1:].str.lower()

#正则表达式用math函数
pattern = r'^[a-zA-Z][a-zA-Z0-9_.-]*@leetcode\.com$'
return users[users['mail'].str.match(pattern)]

# contains用于判断是否包含
return patients[patients['conditions'].str.contains(r'(^|\s)DIAB1')]

7. 其他

  • 排序 (rank):method = 'dense'

    python 复制代码
        scores['rank'] = scores['score'].rank(method = 'dense', ascending = False)
        scores = scores.sort_values('score', ascending = False)[['score', 'rank']]
  • 方法链 (Method Chaining):因为 Pandas 的大多数函数返回的都是一个新的 DataFrame,所以可以像"接龙"一样一直写下去,不用每次都赋值中间变量。

python 复制代码
result = (df
          .dropna(subset=['id'])          # 1. 先删缺失值
          .rename(columns={'id': 'key'})  # 2. 再改名
          .sort_values('key')             # 3. 再排序
         ) # 一气呵成
相关推荐
natide2 小时前
表示/嵌入差异-4-闵可夫斯基距离(Minkowski Distance-曼哈顿距离-欧氏距离-切比雪夫距离
人工智能·深度学习·算法·机器学习·自然语言处理·概率论
ulias2122 小时前
多态理论与实践
java·开发语言·前端·c++·算法
闲看云起2 小时前
Leetcode-day4:从「移动零」到「盛最多水的容器」
数据结构·算法·leetcode·职场和发展
阿虎儿2 小时前
文档对比算法的历史演进
算法
墨上烟雨2 小时前
Pandas 数据清洗详解
pandas
CoderCodingNo3 小时前
【CSP】CSP-XL 2025辽宁复赛真题-第四题, 购物(buy)
算法
nuowenyadelunwen3 小时前
Harvard CS50 Problems Set 5
数据结构·harvard cs50·树,哈希表,链表
mjhcsp3 小时前
P14795 [JOI 2026 二次预选] 分班 / Class Division
数据结构·c++·算法
闻缺陷则喜何志丹3 小时前
【计算几何 最短路 动态规划】P1354 房间最短路问题
数学·算法·动态规划·最短路·计算几何·洛谷