数据选择 #
数据选择概述 #
Pandas 提供了多种灵活的数据选择方法,理解它们的区别对于高效使用 Pandas 至关重要。
text
┌─────────────────────────────────────────────────────────────┐
│ 数据选择方法对比 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 方法 索引类型 返回类型 用途 │
│ ──────── ──────── ──────── ──────── │
│ [] 标签/位置 Series/DF 快速选择 │
│ loc 标签 任意 标签选择 │
│ iloc 位置 任意 位置选择 │
│ at 标签 标量 快速单值 │
│ iat 位置 标量 快速单值 │
│ query 条件 DataFrame 条件查询 │
│ │
└─────────────────────────────────────────────────────────────┘
准备数据 #
python
import pandas as pd
import numpy as np
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve'],
'age': [25, 30, 35, 28, 32],
'city': ['New York', 'London', 'Tokyo', 'Paris', 'Berlin'],
'salary': [50000, 60000, 70000, 55000, 65000]
}, index=['a', 'b', 'c', 'd', 'e'])
print(df)
# name age city salary
# a Alice 25 New York 50000
# b Bob 30 London 60000
# c Charlie 35 Tokyo 70000
# d Diana 28 Paris 55000
# e Eve 32 Berlin 65000
方括号选择 [] #
选择列 #
python
# 选择单列 → Series
print(df['name'])
# a Alice
# b Bob
# c Charlie
# d Diana
# e Eve
# Name: name, dtype: object
# 选择多列 → DataFrame
print(df[['name', 'age']])
# name age
# a Alice 25
# b Bob 30
# c Charlie 35
# d Diana 28
# e Eve 32
# 使用列名属性(仅限有效标识符)
print(df.name) # 等价于 df['name']
选择行(切片) #
python
# 整数切片
print(df[0:2]) # 前 2 行
# name age city salary
# a Alice 25 New York 50000
# b Bob 30 London 60000
# 标签切片
print(df['a':'c']) # 包含结束
# name age city salary
# a Alice 25 New York 50000
# b Bob 30 London 60000
# c Charlie 35 Tokyo 70000
loc - 标签选择 #
loc 是最常用的选择方法,基于标签进行选择。
选择行 #
python
# 选择单行 → Series
print(df.loc['a'])
# name Alice
# age 25
# city New York
# salary 50000
# Name: a, dtype: object
# 选择多行
print(df.loc[['a', 'c']])
# name age city salary
# a Alice 25 New York 50000
# c Charlie 35 Tokyo 70000
# 行切片(包含结束)
print(df.loc['a':'c'])
# name age city salary
# a Alice 25 New York 50000
# b Bob 30 London 60000
# c Charlie 35 Tokyo 70000
选择列 #
python
# 选择单列
print(df.loc[:, 'name'])
# a Alice
# b Bob
# c Charlie
# d Diana
# e Eve
# Name: name, dtype: object
# 选择多列
print(df.loc[:, ['name', 'age']])
# name age
# a Alice 25
# b Bob 30
# c Charlie 35
# d Diana 28
# e Eve 32
# 列切片
print(df.loc[:, 'name':'city'])
# name age city
# a Alice 25 New York
# b Bob 30 London
# c Charlie 35 Tokyo
# d Diana 28 Paris
# e Eve 32 Berlin
同时选择行列 #
python
# 单个值
print(df.loc['a', 'name']) # 'Alice'
# 行切片 + 单列
print(df.loc['a':'c', 'name'])
# a Alice
# b Bob
# c Charlie
# Name: name, dtype: object
# 行切片 + 多列
print(df.loc['a':'c', ['name', 'salary']])
# name salary
# a Alice 50000
# b Bob 60000
# c Charlie 70000
# 多行 + 列切片
print(df.loc[['a', 'c'], 'name':'age'])
# name age
# a Alice 25
# c Charlie 35
条件选择 #
python
# 单条件
print(df.loc[df['age'] > 30])
# name age city salary
# c Charlie 35 Tokyo 70000
# e Eve 32 Berlin 65000
# 多条件
print(df.loc[(df['age'] > 25) & (df['salary'] > 55000)])
# name age city salary
# b Bob 30 London 60000
# c Charlie 35 Tokyo 70000
# e Eve 32 Berlin 65000
# 条件 + 列选择
print(df.loc[df['age'] > 30, ['name', 'salary']])
# name salary
# c Charlie 70000
# e Eve 65000
iloc - 位置选择 #
iloc 基于整数位置进行选择,类似于 NumPy 数组索引。
选择行 #
python
# 选择单行
print(df.iloc[0]) # 第一行
# 选择多行
print(df.iloc[[0, 2]])
# name age city salary
# a Alice 25 New York 50000
# c Charlie 35 Tokyo 70000
# 行切片(不包含结束)
print(df.iloc[0:3])
# name age city salary
# a Alice 25 New York 50000
# b Bob 30 London 60000
# c Charlie 35 Tokyo 70000
# 负索引
print(df.iloc[-1]) # 最后一行
print(df.iloc[-2:]) # 最后两行
选择列 #
python
# 选择单列
print(df.iloc[:, 0]) # 第一列
# 选择多列
print(df.iloc[:, [0, 2]])
# name city
# a Alice New York
# b Bob London
# c Charlie Tokyo
# d Diana Paris
# e Eve Berlin
# 列切片
print(df.iloc[:, 0:2])
# name age
# a Alice 25
# b Bob 30
# c Charlie 35
# d Diana 28
# e Eve 32
同时选择行列 #
python
# 单个值
print(df.iloc[0, 0]) # 'Alice'
# 行切片 + 列切片
print(df.iloc[0:3, 0:2])
# name age
# a Alice 25
# b Bob 30
# c Charlie 35
# 多行 + 多列
print(df.iloc[[0, 2], [0, 3]])
# name salary
# a Alice 50000
# c Charlie 70000
# 负索引
print(df.iloc[-2:, -2:])
# city salary
# d Paris 55000
# e Berlin 65000
at / iat - 快速单值选择 #
当只需要选择单个值时,at 和 iat 比 loc 和 iloc 更快。
python
# at - 标签选择
print(df.at['a', 'name']) # 'Alice'
# iat - 位置选择
print(df.iat[0, 0]) # 'Alice'
# 性能对比
%timeit df.loc['a', 'name'] # 较慢
%timeit df.at['a', 'name'] # 更快
条件选择 #
布尔索引 #
python
# 单条件
print(df[df['age'] > 30])
# 多条件(与)
print(df[(df['age'] > 25) & (df['salary'] > 55000)])
# 多条件(或)
print(df[(df['age'] < 28) | (df['salary'] > 65000)])
# 取反
print(df[~(df['age'] > 30)])
isin 方法 #
python
# 选择特定值
print(df[df['city'].isin(['New York', 'London'])])
# name age city salary
# a Alice 25 New York 50000
# b Bob 30 London 60000
# 取反
print(df[~df['city'].isin(['New York', 'London'])])
between 方法 #
python
# 范围选择
print(df[df['age'].between(28, 32)])
# name age city salary
# b Bob 30 London 60000
# d Diana 28 Paris 55000
# e Eve 32 Berlin 65000
字符串方法 #
python
# 包含
print(df[df['name'].str.contains('a')])
# name age city salary
# a Alice 25 New York 50000
# c Charlie 35 Tokyo 70000
# d Diana 28 Paris 55000
# 开头
print(df[df['name'].str.startswith('A')])
# name age city salary
# a Alice 25 New York 50000
# 正则表达式
print(df[df['name'].str.match(r'[AB]')])
# name age city salary
# a Alice 25 New York 50000
# b Bob 30 London 60000
query 方法 #
query 方法使用字符串表达式进行查询,语法更简洁。
python
# 基本查询
print(df.query('age > 30'))
# name age city salary
# c Charlie 35 Tokyo 70000
# e Eve 32 Berlin 65000
# 多条件
print(df.query('age > 25 and salary > 55000'))
print(df.query('age > 25 & salary > 55000')) # 等价
# 或条件
print(df.query('age < 28 or salary > 65000'))
# 使用变量
min_age = 30
print(df.query('age > @min_age'))
# in 操作
print(df.query('city in ["New York", "London"]'))
# 字符串方法
print(df.query('name.str.contains("a")'))
# 索引查询
df_query = df.copy()
df_query.index.name = 'idx'
print(df_query.query('idx in ["a", "b"]'))
get 方法 #
get 方法可以安全地选择列,如果列不存在返回默认值。
python
# 选择存在的列
print(df.get('name'))
# 选择不存在的列
print(df.get('nonexistent', default='Not Found'))
# 'Not Found'
mask 和 where #
python
# where - 保留满足条件的值
print(df.where(df['age'] > 30))
# name age city salary
# a NaN NaN NaN NaN
# b NaN NaN NaN NaN
# c Charlie 35.0 Tokyo 70000.0
# d NaN NaN NaN NaN
# e Eve 32.0 Berlin 65000.0
# mask - 保留不满足条件的值
print(df.mask(df['age'] > 30))
# name age city salary
# a Alice 25.0 New York 50000.0
# b Bob 30.0 London 60000.0
# c NaN NaN NaN NaN
# d Diana 28.0 Paris 55000.0
# e NaN NaN NaN NaN
# 替换值
print(df.where(df['age'] > 30, other='Low'))
选择方法对比 #
text
┌─────────────────────────────────────────────────────────────┐
│ 选择方法选择指南 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 场景 推荐方法 │
│ ──────────────────────── ──────────────────────────── │
│ 选择单列 df['col'] │
│ 选择多列 df[['col1', 'col2']] │
│ 选择单行(标签) df.loc['label'] │
│ 选择单行(位置) df.iloc[0] │
│ 选择单个值(标签) df.at['label', 'col'] │
│ 选择单个值(位置) df.iat[0, 0] │
│ 条件选择 df[df['col'] > value] │
│ 复杂条件 df.query('...') │
│ 行列同时选择 df.loc[rows, cols] │
│ │
└─────────────────────────────────────────────────────────────┘
最佳实践 #
避免链式索引 #
python
# 不推荐:链式索引
df[df['age'] > 30]['salary'] = 100000 # SettingWithCopyWarning
# 推荐:loc
df.loc[df['age'] > 30, 'salary'] = 100000
使用 copy 避免警告 #
python
# 创建副本
subset = df[df['age'] > 30].copy()
subset['salary'] = 100000 # 安全
使用 isin 替代多个 or #
python
# 不推荐
df[(df['city'] == 'New York') | (df['city'] == 'London') | (df['city'] == 'Tokyo')]
# 推荐
df[df['city'].isin(['New York', 'London', 'Tokyo'])]
下一步 #
掌握了数据选择后,接下来学习 数据过滤,深入了解如何高效地过滤和筛选数据!
最后更新:2026-04-04