Pandas 索引和切片

在 Pandas 中,索引是指从 DataFrame 中访问数据的行和列,而切片是指访问一系列行和列。

我们可以使用不同的方法从 DataFrame 中访问数据或数据范围。


访问 DataFrame 的列

我们可以使用方括号 ([]) 运算符访问 DataFrame 的列。例如:

import pandas as pd

# create a DataFrame
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'Age': [25, 32, 18, 47, 33],
    'City': ['New York', 'Paris', 'London', 'Tokyo', 'Sydney']
}
df = pd.DataFrame(data)

# access the Name column names = df['Name']
print(names)

输出

0      Alice
1        Bob
2    Charlie
3      David
4        Eve
Name: Name, dtype: object

在此示例中,我们使用 [] 运算符访问了 dfName 列。它返回了一个包含 Name 列值的 Series。

我们也可以使用 [] 运算符访问多个列。例如:

import pandas as pd

# create a DataFrame
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'Age': [25, 32, 18, 47, 33],
    'City': ['New York', 'Paris', 'London', 'Tokyo', 'Sydney']
}
df = pd.DataFrame(data)

# access multiple columns name_city = df[['Name','City']]
print(name_city)

输出

      Name      City
0    Alice  New York
1      Bob     Paris
2  Charlie    London 
3    David     Tokyo
4      Eve    Sydney

在此示例中,我们使用 [] 运算符访问了 dfNameCity 列。它返回了一个 DataFrame,其中包含 dfNameCity 的值。

但是,[] 运算符的功能有限。即使是选择行、切片 DataFrame 和选择单个元素等基本操作,仅使用 [] 运算符也很棘手。

因此,我们使用 .loc.iloc 属性来索引和切片 DataFrame。与 [] 运算符相比,它们提供了更大的灵活性。


Pandas .loc

在 Pandas 中,我们使用 .loc 属性通过基于标签的索引来访问和修改 DataFrame 中的数据。它允许我们根据标签选择特定的行和列。

语法

Pandas 中 .loc 的语法是

df.loc[row_indexer, column_indexer]

这里,

  • row_indexer - 按标签选择行,可以是单个标签、标签列表或布尔数组
  • column_indexer - 选择列,也可以是单个标签、标签列表或布尔数组

示例:使用 .loc 进行索引

我们可以使用 .loc 通过索引访问 DataFrame 中的数据。

import pandas as pd

# create a DataFrame
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'Age': [25, 32, 18, 47, 33],
    'City': ['New York', 'Paris', 'London', 'Tokyo', 'Sydney']
}
df = pd.DataFrame(data)
# access a single row single_row = df.loc[2]
print("Single row:") print(single_row) print()
# access rows 0, 3 and 4 row_list = df.loc[[0, 3, 4]]
print("List of Rows:") print(row_list) print()
# access a list of columns column_list = df.loc[:,['Name', 'Age']]
print("List of Columns:") print(column_list) print()
# access second row of 'Name' column specific_value = df.loc[1, 'Name']
print("Specific Value:") print(specific_value)

输出

Single row:
Name    Charlie
Age          18
City     London
Name: 2, dtype: object

List of Rows:
    Name  Age      City
0  Alice   25  New York
3  David   47     Tokyo
4    Eve   33    Sydney

List of Columns:
      Name  Age
0    Alice   25
1      Bob   32
2  Charlie   18
3    David   47
4      Eve   33

Specific Value:
Bob

在这里,我们使用 .loc 通过相应的标签访问了一行、多行、多列以及一个特定值。

在这一行:

column_list = df.loc[:,['Name', 'Age']]

: 运算符表示选择所有行。


示例:使用 .loc 进行切片

我们还可以使用 .loc 访问一行和列的范围。如果我们顺序访问 DataFrame(例如从索引13),我们称之为切片。

import pandas as pd

# create a DataFrame
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'Age': [25, 32, 18, 47, 33],
    'City': ['New York', 'Paris', 'London', 'Tokyo', 'Sydney']
}

df = pd.DataFrame(data)

# slice rows from index 1 to 3 slice_rows = df.loc[1:3]
print("Sliced Rows:") print(slice_rows) print()
# slicing columns from 'Name' to 'Age' slice_columns = df.loc[:, 'Name':'Age']
print("Sliced Columns:") print(slice_columns)

输出

Sliced Rows:
      Name  Age    City
1      Bob   32   Paris
2  Charlie   18  London
3    David   47   Tokyo

Sliced Columns:
      Name  Age
0    Alice   25
1      Bob   32
2  Charlie   18
3    David   47
4      Eve   33

在这里,我们使用 .loc: 运算符对行和列进行了切片。

请注意,端点是包含在内的,即 df.loc[1:3] 中同时包含13这两个位置。


示例:使用 .loc 进行布尔索引

我们可以使用布尔索引来设置条件并过滤数据。

import pandas as pd

# create a DataFrame
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'Age': [25, 32, 18, 47, 33],
    'City': ['New York', 'Paris', 'London', 'Tokyo', 'Sydney']
}
df = pd.DataFrame(data)

# boolean indexing with .loc boolean_index = df.loc[df['Age'] > 30]
print("Filtered DataFrame: ") print(boolean_index)

输出

Boolean Indexing:
      Name  Age    City
1      Bob   32   Paris
3    David   47   Tokyo
4      Eve   33  Sydney

在此示例中,我们选择了 Age 值大于30的所有行。


Pandas .iloc

在 Pandas 中,.iloc 属性用于通过基于整数的索引来访问和修改 DataFrame 中的数据。它允许我们根据整数位置选择特定的行和列。

语法

Pandas 中 .iloc 的语法是

df.iloc[row_indexer, column_indexer]

这里,

  • row_indexer - 用于按整数位置选择行,可以是单个整数、整数列表或布尔数组
  • column_indexer - 选择列,也可以是单个整数、整数列表或布尔数组

示例:使用 .iloc 进行索引

import pandas as pd

# create a DataFrame
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'Age': [25, 32, 18, 47, 33],
    'City': ['New York', 'Paris', 'London', 'Tokyo', 'Sydney']
}
df = pd.DataFrame(data)

# access single row single_row = df.iloc[2]
# access rows 0, 3 and 4 row_list = df.iloc[[0, 3, 4]] # access columns 0 and 2 column_list = df.iloc[:,[0,2]]
# access a specific value specific_value = df.iloc[1, 0]
# display result print("Single Row:") print(single_row) print() print("List of Rows:") print(row_list) print() print("List of Columns:") print(column_list) print() print("Specific Value:") print(specific_value)

输出

Single Row:
Name    Charlie
Age          18
City     London
Name: 2, dtype: object

List of Rows:
    Name  Age      City
0  Alice   25  New York
3  David   47     Tokyo
4    Eve   33    Sydney

List of Columns:
      Name      City
0    Alice  New York
1      Bob     Paris
2  Charlie    London
3    David     Tokyo
4      Eve    Sydney

Specific Value:
Bob

在这里,我们使用 .iloc 通过相应的整数值访问了一行、多行、多列以及一个特定值。


示例:使用 .iloc 进行切片

import pandas as pd

# create a sample DataFrame
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'Age': [25, 32, 18, 47, 33],
    'City': ['New York', 'Paris', 'London', 'Tokyo', 'Sydney']
}
df = pd.DataFrame(data)

# slice rows from position 1 to 3 slice_rows = df.iloc[1:4]
# slice columns from position 0 to 1 slice_columns = df.iloc[:, 0:2]
# display results print("Sliced Rows:") print(slice_rows) print() print("Sliced Columns:") print(slice_columns)

输出

Sliced Rows:
      Name  Age    City
1      Bob   32   Paris
2  Charlie   18  London
3    David   47   Tokyo

Sliced Columns:
      Name  Age
0    Alice   25
1      Bob   32
2  Charlie   18
3    David   47
4      Eve   33

请注意,位置 4 不包含在 df.iloc[1:4] 中。


.loc 与 .iloc 的区别

.loc.iloc 的主要区别如下:

依据 .loc .iloc
索引 基于标签的索引 基于整数的索引
端点 端点包含在内 端点不包含在内
布尔索引 支持布尔索引 不支持布尔索引

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战