跳至主要内容

Python 选择列教程

使用 Python Pandas 从 DataFrame 中选择列。按照我们的教程配合代码示例,学习多种选择数据的方法!
· 7分钟 阅读

使用 AI 探索

若要在本教程中轻松亲自运行所有示例代码,您可以免费 创建一个 DataLab 工作簿,其中预装了 Python,并包含所有代码示例。

如果您已经有一个 DataFrame,并希望访问或选择其中的部分行/列,您可以使用方括号,或使用 loc 和 iloc 等更高级的方法。

使用方括号选择列

现在,假设您想从 brics DataFrame 中选择 country 列。为此,输入 brics,然后在方括号中写上列标签。

选择单列

          country     capital        area    population
BR         Brazil    Brasilia       8.516        200.40
RU         Russia      Moscow      17.100        143.50
IN         India    New Dehli       3.286       1252.00
CH         China      Beijing       9.597       1357.00
SA  South Africa     Pretoria       1.221         52.98
brics["country"]
BR         Brazil
RU         Russia
IN         India
CH         China
SA  South Africa
Name: country, dtype: object

检查对象类型

让我们用 type() 函数检查返回对象的类型。

type(brics["country"])
pandas.core.series.Series

从上述输出可以看出,这是一个 pandas 的 Series!可以把 Series 看作是一维数组,并且可以像 DataFrame 一样带有标签。

如果您想选择数据并保持为 DataFrame,需要使用双重方括号:

brics[["country"]]
BR         Brazil
RU         Russia
IN         India
CH         China
SA  South Africa

如果我们检查该输出的类型,它就是一个 DataFrame!不过只有一列。

type(brics[["country"]])
pandas.core.frame.DataFrame

理解 .shape 属性

现在来看一下 .shape 属性。pandas 中的 .shape 提供了一种快速查看 DataFrame 或 Series 结构的方式。它返回一个元组,对于 DataFrame 表示行数和列数,对于 Series 则只表示行数。

示例:在 DataFrame 上使用 .shape

再看一下名为 brics 的 DataFrame:

import pandas as pd

# Sample DataFrame
data = {
    "country": ["Brazil", "Russia", "India", "China", "South Africa"],
    "capital": ["Brasilia", "Moscow", "New Delhi", "Beijing", "Pretoria"],
    "area": [8.516, 17.1, 3.286, 9.597, 1.221],
    "population": [200.4, 143.5, 1252, 1357, 52.98],
}
brics = pd.DataFrame(data, index=["BR", "RU", "IN", "CH", "SA"])

# Check the shape
print(brics.shape)

输出:

(5, 4)

这表明 brics DataFrame 有 5 行和 4 列。

示例:在 Series 上使用 .shape

当从 DataFrame 中选择单列(例如 country 列)时,结果是一个 Series。在这种情况下,.shape 的表现如下:

country_series = brics["country"]
print(country_series.shape)

输出:

(5,)

这里,Series 有 5 行且没有列,因为 Series 是一维的。

回顾一下:对于 DataFrame,.shape 返回一个包含行数和列数的元组;对于 Series,它返回行数。使用 .shape 可以快速检查数据集大小,或验证筛选与选择的结果。另外请记住,.shape 是一个属性,因此无需加括号即可访问。

选择多列

您可以扩展调用以选择两列。我们来试试选择 country 和 capital。

brics[["country", "capital"]]
          country     capital
BR         Brazil    Brasilia
RU         Russia      Moscow
IN         India    New Dehli
CH         China      Beijing
SA  South Africa     Pretoria

仔细观察,您实际上是把一个包含列标签的列表放在另一组方括号中,最终得到一个仅包含 country 和 capital 两列的子 DataFrame。

使用方括号选择行

方括号不止能选择列。您也可以用它们从 DataFrame 中获取行(观测)。

示例

只有在指定切片(例如 0:4)时,您才能用方括号选择行。另外,这里使用的是行的整数索引,而不是行标签!

要获取 brics DataFrame 的第二、第三和第四行,我们使用从 1 到 4 的切片。请记住,切片的结束是排他的,且索引从零开始。

brics[1:4]
          country     capital     area    population
RU         Russia      Moscow   17.100        143.50
IN         India    New Delhi    3.286       1252.00
CH         China      Beijing    9.597       1357.00

这些方括号是可用的,但功能有限。理想情况下,我们希望有类似二维 Numpy 数组的东西,同样使用方括号。逗号前的索引或切片指行,逗号后的切片指列。

二维 Numpy 数组示例:

my_array[rows, columns]

如果您想在 pandas 中做类似的事情,需要使用 loc 和 iloc 函数。

  • loc:基于标签

  • iloc:基于整数位置

loc 函数

loc 是一种基于标签选择数据子集的技术。让我们查看 brics DataFrame 并获取俄罗斯的行。

为此,您需要在 loc 后的方括号内放入感兴趣的标签。

选择行

brics.loc["RU"]
country     Russia
capital     Moscow
area          17.1
population   143.5
Name: RU, dtype: object

我们得到一个包含该行所有信息的 pandas Series;但不太方便的是,它按行分多行显示。若要得到 DataFrame,需要把字符串 RU 再放入一层方括号中。我们也可以同时选择多行。假设您还想包括印度和中国,只需把这些行标签加入列表即可。

brics.loc[["RU", "IN", "CH"]]
          country     capital     area    population
RU         Russia      Moscow   17.100        143.50
IN         India    New Delhi    3.286       1252.00
CH         China      Beijing    9.597       1357.00

与基本方括号的不同之处在于,使用 loc 时可以在后面加一个逗号,并指定感兴趣的列。

选择行和列

让我们在上一个调用的基础上扩展,只包含 country 和 capital 两列。我们添加一个逗号并列出要保留的列标签。将返回它们的交集。

brics.loc[["RU", "IN", "CH"], ["country", "capital"]]
          country     capital
RU         Russia      Moscow
IN         India    New Delhi
CH         China      Beijing

您还可以使用 loc 来选择所有行,但只保留特定的列。只需用冒号替换第一个指定行标签的列表即可。一个从头到尾的切片。这次我们会得到所有行,但只有两列。

选择所有行与特定列

brics.loc[:, ["country", "capital"]]
          country     capital
BR         Brazil    Brasilia
RU         Russia      Moscow
IN         India    New Delhi
CH         China      Beijing
SA  South Africa     Pretoria

iloc 函数

iloc 函数允许您基于位置或索引来对 pandas DataFrame 进行子集选择。

选择行

我们用与 loc 相同的数据和类似示例。先获取俄罗斯这一行。

brics.iloc[[1]]
          country     capital     area    population
RU         Russia      Moscow   17.100        143.50

要获取俄罗斯、印度和中国的行,现在可以使用索引 1, 2, 3 的列表。

brics.iloc[[1, 2, 3]]
          country     capital     area    population
RU         Russia      Moscow   17.100        143.50
IN         India    New Delhi    3.286       1252.00
CH         China      Beijing    9.597       1357.00

选择行和列

与 loc 类似,我们也可以用 iloc 同时选择行和列。这里我们将选择俄罗斯、印度和中国的行,以及 country 与 capital 两列。

brics.iloc[[1, 2, 3], [0, 1]]
          country     capital
RU         Russia      Moscow
IN         India    New Delhi
CH         China      Beijing

选择所有行与特定列

最后,如果您想选择所有行但只保留 country 和 capital 两列,可以这样做:

brics.loc[:, [0, 1]]
          country     capital
BR         Brazil    Brasilia
RU         Russia      Moscow
IN         India    New Delhi
CH         China      Beijing
SA  South Africa     Pretoria

loc 和 iloc 函数非常相似。唯一的区别在于您引用行和列的方式。

交互式示例:选择数据子集

在以下示例中,汽车数据从 CSV 文件导入为一个 Pandas DataFrame。若只选择 cars 中的 cars_per_cap 列,您可以使用:

cars['cars_per_cap']
cars[['cars_per_cap']]

单中括号版本返回 Pandas Series;双中括号版本返回 Pandas DataFrame。

  • 您将使用单个方括号将 cars 的 country 列以 Pandas Series 的形式打印出来。
  • 然后使用双重方括号将 cars 的 country 列以 Pandas DataFrame 的形式打印出来。
  • 最后,使用双重方括号按此顺序打印一个同时包含 country 和 drives_right 列的 DataFrame。
# Import cars data
import pandas as pd
cars = pd.read_csv('cars.csv', index_col = 0)

# Print out country column as Pandas Series
print(cars['country'])

# Print out country column as Pandas DataFrame
print(cars[['country']])

# Print out DataFrame with country and drives_right columns
print(cars[['country', 'drives_right']])

当我们运行上述代码时,会产生如下结果:

US     United States
AUS        Australia
JPN            Japan
IN             India
RU            Russia
MOR          Morocco
EG             Egypt
Name: country, dtype: object
           country
US   United States
AUS      Australia
JPN          Japan
IN           India
RU          Russia
MOR        Morocco
EG           Egypt
           country  drives_right
US   United States          True
AUS      Australia         False
JPN          Japan         False
IN           India         False
RU          Russia          True
MOR        Morocco          True
EG           Egypt          True

亲自试一试。

要进一步学习 pandas,请观看我们课程 Intermediate Python 中的这个视频。

本文内容摘自 DataCamp 的 Intermediate Python 课程,作者 Hugo Bowne-Anderson。

主题