【Pandas入门教程】如何选择DataFrame的子集

如何选择DataFrame的子集

来源:Pandas官网:https://pandas.pydata.org/docs/getting_started/intro_tutorials/index.html

在这里插入图片描述

导包
import pandas as pd
数据准备

还是使用的泰坦尼克号的数据

titanic = pd.read_csv("titanic.csv")
titanic.head()
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
【1】如何从DataFrame中选择特定列?

在这里插入图片描述

我对泰坦尼克号乘客的年龄感兴趣。

ages = titanic['Age']
ages.head()
0    22.0
1    38.0
2    26.0
3    35.0
4    35.0
Name: Age, dtype: float64

若要选择单个列,在相关列的列名称中使用方括号 []

DataFrame中的每一列都是一个Series。选择单个列时,返回的对象是pandas Series。我们可以通过检查输出的类型来验证这一点:

type(titanic['Age'])
pandas.core.series.Series

并查看输出的shape:

titanic['Age'].shape
(891,)

DataFrame.shape 是 pandas Series和数据DataFrame的属性,其中包含行数和列数:(nrows, ncolumns)。pandas Series是一维的,只返回行数。

我对泰坦尼克号乘客的年龄和性别很感兴趣。

age_sex = titanic[['Age', 'Sex']]
age_sex.head()
AgeSex
022.0male
138.0female
226.0female
335.0female
435.0male

要选择多个列,使用选择括号内的列名称列表[].

【注意】内部方括号定义具有列名的 Python 列表,而外部方括号用于从 pandas 数据DataFrame

返回的数据类型是pandas dataframe:

type(titanic[['Age', 'Sex']])
pandas.core.frame.DataFrame
titanic[['Age', 'Sex']].shape
(891, 2)

所选内容返回了一个包含 891 行和 2 列的数据DataFrame。记住,DataFrame是二维的,具有行和列维度。

【2】如何从DataFrame中筛选特定行

在这里插入图片描述

我对35岁以上的乘客感兴趣。

above_35 = titanic[titanic['Age'] > 35]
above_35.head()
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
6701McCarthy, Mr. Timothy Jmale54.0001746351.8625E46S
111211Bonnell, Miss. Elizabethfemale58.00011378326.5500C103S
131403Andersson, Mr. Anders Johanmale39.01534708231.2750NaNS
151612Hewlett, Mrs. (Mary D Kingcome)female55.00024870616.0000NaNS

要基于条件表达式选择行,在选择括号内使用条件[].

选择括号 titanic[“Age”] > 35 内的条件检查 Age 列的值大于 35 的行:

titanic['Age'] > 35
0      False
1       True
2      False
3      False
4      False
       ...  
886    False
887    False
888    False
889    False
890    False
Name: Age, Length: 891, dtype: bool

条件表达式 (> 的输出,但也包括 ==、!=、<、<=,…将起作用)实际上是熊猫Series的布尔值(True或False),其行数与原始DataFrame相同。此类布尔值Series可用于筛选DataFrame,方法是将其放在选择方括号 [] 之间。将仅选择值为 True 的行。

我们从之前知道,原始的泰坦尼克号DataFrame由 891 行组成。让我们通过检查生成的DataFrame above_35 shape 属性来查看满足条件的行数above_35:

above_35.shape
(217, 12)

我对2级和3号舱的泰坦尼克号乘客感兴趣。

class_23 = titanic[titanic['Pclass'].isin([2, 3])]
class_23.head()
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
5603Moran, Mr. JamesmaleNaN003308778.4583NaNQ
7803Palsson, Master. Gosta Leonardmale2.03134990921.0750NaNS

与条件表达式类似,isin() 条件函数为提供列表中的值的每一行返回 True。要基于此类函数筛选行,请使用选择方括号 [] 内的条件函数。在这种情况下,选择括号 titanic[“Pclass”].isin([2, 3]) 中的条件检查 Pclass 列是 2 行还是 3 行。

以上等效于按类为 2 或 3 的行进行筛选,并将这两个语句与 |(或)运算符组合在一起:

class_23 = titanic[(titanic['Pclass'] == 2) | (titanic['Pclass'] == 3)]
class_23.head()
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
5603Moran, Mr. JamesmaleNaN003308778.4583NaNQ
7803Palsson, Master. Gosta Leonardmale2.03134990921.0750NaNS

组合多个条件语句时,每个条件必须用括号 () 括起来。此外,不能使用 or/and,但需要使用 or 运算符| 和 and 运算符&.

我想使用已知年龄的乘客数据。

age_no_na = titanic[titanic['Age'].notna()]
age_no_na.head()
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS

notna() 条件函数为每行返回一个 True,这些值不是 Null 值。因此,这可以与选择括号 [] 结合使用以过滤数据表。

您可能想知道实际发生了什么变化,因为前 5 行仍然是相同的值。验证的一种方法是检查形状是否已更改:

age_no_na.shape
(714, 12)
【3】如何从DataFrame选择特定的行和列

在这里插入图片描述

我对35岁以上乘客的姓名感兴趣。

adult_names = titanic.loc[titanic['Age'] > 35, 'Name']
adult_names.head()
1     Cumings, Mrs. John Bradley (Florence Briggs Th...
6                               McCarthy, Mr. Timothy J
11                             Bonnell, Miss. Elizabeth
13                          Andersson, Mr. Anders Johan
15                     Hewlett, Mrs. (Mary D Kingcome) 
Name: Name, dtype: object

在这种情况下,行和列的子集是一次性创建的,仅使用选择括号 [] 已不够。选择括号 [] 前面需要 loc/iloc 运算符。使用 loc/iloc 时,逗号前面的部分是所需的行,逗号后面的部分是要选择的列。

使用列名、行标签或条件表达式时,请在选择方括号 [] 前面使用 loc 运算符。对于逗号之前和之后的部分,您可以使用单个标签、标签列表、标签切片、条件表达式或冒号。使用冒号指定要选择所有行或列。

我对第 10 到 25 行和第 3 到 5 列感兴趣。

titanic.iloc[9:25, 2:5]
PclassNameSex
92Nasser, Mrs. Nicholas (Adele Achem)female
103Sandstrom, Miss. Marguerite Rutfemale
111Bonnell, Miss. Elizabethfemale
123Saundercock, Mr. William Henrymale
133Andersson, Mr. Anders Johanmale
143Vestrom, Miss. Hulda Amanda Adolfinafemale
152Hewlett, Mrs. (Mary D Kingcome)female
163Rice, Master. Eugenemale
172Williams, Mr. Charles Eugenemale
183Vander Planke, Mrs. Julius (Emelia Maria Vande...female
193Masselmani, Mrs. Fatimafemale
202Fynney, Mr. Joseph Jmale
212Beesley, Mr. Lawrencemale
223McGowan, Miss. Anna "Annie"female
231Sloper, Mr. William Thompsonmale
243Palsson, Miss. Torborg Danirafemale

同样,行和列的子集是一次性完成的,仅使用选择括号 [] 已不够。当根据某些行和/或列在表格中的位置对它们特别感兴趣时,请使用选择括号前面的 iloc 运算符[].

使用 loc 或 iloc 选择特定行和/或列时,可以为所选数据分配新值。例如,要将名称anonymous分配给第三列的前 3 个元素:

titanic.iloc[0:3, 3] = "anonymous"

titanic.head()
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103anonymousmale22.010A/5 211717.2500NaNS
1211anonymousfemale38.010PC 1759971.2833C85C
2313anonymousfemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
【小结】

选择数据子集时,使用方括号 []
在这些括号内,您可以使用单个列/行标签、列/行标签列表、标签切片、条件表达式或冒号。

使用行和列名称时,使用 loc 选择特定的行和/或列。

使用表中的位置时,使用 iloc 选择特定的行和/或列。

我们可以根据 loc/iloc 为所选内容指定新值.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ding Jiaxiong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值