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. 再排序
         ) # 一气呵成
相关推荐
Morwit1 分钟前
【力扣hot100】 1. 两数之和
数据结构·c++·算法·leetcode·职场和发展
py有趣9 分钟前
力扣热门100题之岛屿的数量(DFS/BFS经典题)
leetcode·深度优先·宽度优先
无小道31 分钟前
算法——暴力+优化
算法·优化·暴力
Free Tester35 分钟前
如何判断 LeakCanary 报告的严重程度
java·jvm·算法
zyq99101_11 小时前
DFS算法实战:经典例题代码解析
python·算法·蓝桥杯·深度优先
智者知已应修善业1 小时前
【51单片机单按键切换广告屏】2023-5-17
c++·经验分享·笔记·算法·51单片机
广州灵眸科技有限公司1 小时前
为RK3588注入澎湃算力:RK1820 AI加速卡完整适配与评测指南
linux·网络·人工智能·物联网·算法
qinian_ztc1 小时前
frida 14.2.18 安装报错解决
算法·leetcode·职场和发展
AI应用实战 | RE1 小时前
012、检索器(Retrievers)核心:从向量库中智能查找信息
人工智能·算法·机器学习·langchain
凤年徐1 小时前
C++手撕红黑树:从0到200行,拿下STL map底层核心
c++·后端·算法