使用方括号选择行
方括号不止能选择列。您也可以用它们从 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。
若要在本教程中轻松亲自运行所有示例代码,您可以免费 创建一个 DataLab 工作簿,其中预装了 Python,并包含所有代码示例。
如果您已经有一个 DataFrame,并希望访问或选择其中的部分行/列,您可以使用方括号,或使用
loc和iloc等更高级的方法。使用方括号选择列
现在,假设您想从
bricsDataFrame 中选择 country 列。为此,输入brics,然后在方括号中写上列标签。选择单列
检查对象类型
让我们用
type()函数检查返回对象的类型。从上述输出可以看出,这是一个
pandas的 Series!可以把 Series 看作是一维数组,并且可以像 DataFrame 一样带有标签。如果您想选择数据并保持为 DataFrame,需要使用双重方括号:
如果我们检查该输出的类型,它就是一个 DataFrame!不过只有一列。
理解 .shape 属性
现在来看一下
.shape属性。pandas 中的.shape提供了一种快速查看 DataFrame 或 Series 结构的方式。它返回一个元组,对于 DataFrame 表示行数和列数,对于 Series 则只表示行数。示例:在 DataFrame 上使用 .shape
再看一下名为
brics的 DataFrame:输出:
这表明
bricsDataFrame 有 5 行和 4 列。示例:在 Series 上使用 .shape
当从 DataFrame 中选择单列(例如
country列)时,结果是一个 Series。在这种情况下,.shape的表现如下:输出:
这里,Series 有 5 行且没有列,因为 Series 是一维的。
选择多列
您可以扩展调用以选择两列。我们来试试选择
country和capital。仔细观察,您实际上是把一个包含列标签的列表放在另一组方括号中,最终得到一个仅包含
country和capital两列的子 DataFrame。