数据选择 #

数据选择概述 #

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