In [1]: import pandas as pd
- Titanic data
本教程使用泰坦尼克号数据集,存储为CSV格式。数据包括以下数据列:
PassengerId: 每位乘客的ID。
幸存:乘客是否幸存的指示。
0
表示是,1
表示否。Pclass:三种票等级之一:等级
1
、等级2
和等级3
。姓名:乘客的姓名。
Sex: 乘客的性别。
年龄:乘客的年龄(岁)。
SibSp: 船上的兄弟姐妹或配偶数量。
Parch: 父母或孩子在船上的数量。
票:乘客的票号。
票价:指示票价。
Cabin: 乘客的舱位号。
Embarked: 登船港口。
In [2]: titanic = pd.read_csv("data/titanic.csv") In [3]: titanic.head() Out[3]: PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked 0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S 1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C 2 3 1 3 Heikkinen, Miss Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S 3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S 4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
我如何选择一个 DataFrame
的子集?#
如何从 DataFrame
中选择特定的列?#
我对泰坦尼克号乘客的年龄感兴趣。
In [4]: ages = titanic["Age"] In [5]: ages.head() Out[5]: 0 22.0 1 38.0 2 26.0 3 35.0 4 35.0 Name: Age, dtype: float64
要选择单个列,请使用方括号
[]
和感兴趣的列名。
在 DataFrame
中的每一列都是一个 Series
。当选择单个列时,返回的对象是一个 pandas Series
。我们可以通过检查输出的类型来验证这一点:
In [6]: type(titanic["Age"])
Out[6]: pandas.core.series.Series
并且看看输出 shape
的样子:
In [7]: titanic["Age"].shape
Out[7]: (891,)
DataFrame.shape
是一个属性(记得 阅读和写入教程 ,不要为属性使用括号),包含行数和列数的 pandas Series
和 DataFrame
:(nrows, ncolumns)。一个 pandas Series 是 1 维的,只返回行数。
我对泰坦尼克号乘客的年龄和性别感兴趣。
In [8]: age_sex = titanic[["Age", "Sex"]] In [9]: age_sex.head() Out[9]: Age Sex 0 22.0 male 1 38.0 female 2 26.0 female 3 35.0 female 4 35.0 male
要选择多列,请在选择括号
[]
内使用列名列表。
备注
内层方括号定义了一个包含列名的 Python 列表,而外层方括号用于从前一个示例中所示的 pandas DataFrame
中选择数据。
返回的数据类型是 pandas DataFrame:
In [10]: type(titanic[["Age", "Sex"]])
Out[10]: pandas.DataFrame
In [11]: titanic[["Age", "Sex"]].shape
Out[11]: (891, 2)
选择返回了一个包含891行和2列的 DataFrame
。记住,DataFrame
是二维的,既有行维度也有列维度。
有关索引的基本信息,请参阅用户指南中关于 索引和选择数据 的部分。
如何从一个 DataFrame
中过滤特定的行?#
我对超过35岁的乘客感兴趣。
In [12]: above_35 = titanic[titanic["Age"] > 35] In [13]: above_35.head() Out[13]: PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked 1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C 6 7 0 1 McCarthy, Mr. Timothy J male 54.0 0 0 17463 51.8625 E46 S 11 12 1 1 Bonnell, Miss Elizabeth female 58.0 0 0 113783 26.5500 C103 S 13 14 0 3 Andersson, Mr. Anders Johan male 39.0 1 5 347082 31.2750 NaN S 15 16 1 2 Hewlett, Mrs. (Mary D Kingcome) female 55.0 0 0 248706 16.0000 NaN S
要根据条件表达式选择行,请在选择括号
[]
内使用条件。
选择括号内的条件 titanic["Age"] > 35
检查 Age
列的值大于 35 的行:
In [14]: titanic["Age"] > 35
Out[14]:
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
条件表达式的输出(>
,还有``==``、!=
、<
、<=``等也可以工作)实际上是一个布尔值(``True
或 False
)的 pandas Series
,其行数与原始 DataFrame
相同。这样的布尔值 Series
可以用于通过将其放在选择括号 []
之间来过滤 DataFrame
。只有值为 True
的行才会被选中。
从前我们知道原始的泰坦尼克 DataFrame
包含 891 行。让我们通过检查结果 DataFrame
above_35
的 shape
属性来看看满足条件的行数:
In [15]: above_35.shape
Out[15]: (217, 12)
我对来自二等舱和三等舱的泰坦尼克号乘客感兴趣。
In [16]: class_23 = titanic[titanic["Pclass"].isin([2, 3])] In [17]: class_23.head() Out[17]: PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked 0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S 2 3 1 3 Heikkinen, Miss Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S 4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S 5 6 0 3 Moran, Mr. James male NaN 0 0 330877 8.4583 NaN Q 7 8 0 3 Palsson, Master Gosta Leonard male 2.0 3 1 349909 21.0750 NaN S
类似于条件表达式,
isin()
条件函数对每一行返回True
,如果这些行的值在提供的列表中。要根据这样的函数过滤行,请在选择括号[]
内使用条件函数。在这种情况下,选择括号[]
内的条件titanic["Pclass"].isin([2, 3])
检查Pclass
列是否为 2 或 3 的行。
上述等同于按类为2或3的行进行过滤,并用 |
(或)运算符组合这两个语句:
In [18]: class_23 = titanic[(titanic["Pclass"] == 2) | (titanic["Pclass"] == 3)]
In [19]: class_23.head()
Out[19]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
2 3 1 3 Heikkinen, Miss Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
5 6 0 3 Moran, Mr. James male NaN 0 0 330877 8.4583 NaN Q
7 8 0 3 Palsson, Master Gosta Leonard male 2.0 3 1 349909 21.0750 NaN S
备注
当结合多个条件语句时,每个条件必须用括号 ()
包围。此外,你不能使用 or
/and
,而需要使用 or
运算符 |
和 and
运算符 &
。
我希望处理已知年龄的乘客数据。
In [20]: age_no_na = titanic[titanic["Age"].notna()] In [21]: age_no_na.head() Out[21]: PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked 0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S 1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C 2 3 1 3 Heikkinen, Miss Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S 3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S 4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
notna()
条件函数为每一行返回一个True
,如果该行的值不是Null
值。因此,这可以与选择括号[]
结合使用来过滤数据表。
你可能想知道实际上改变了什么,因为前5行仍然是相同的值。一种验证方法是检查形状是否发生了变化:
In [22]: age_no_na.shape
Out[22]: (714, 12)
有关处理缺失值的更多专用功能,请参阅用户指南中关于 处理缺失数据 的部分。
如何从 DataFrame
中选择特定的行和列?#
我对超过35岁的乘客的姓名感兴趣。
In [23]: adult_names = titanic.loc[titanic["Age"] > 35, "Name"] In [24]: adult_names.head() Out[24]: 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列感兴趣。
In [25]: titanic.iloc[9:25, 2:5] Out[25]: Pclass Name Sex 9 2 Nasser, Mrs. Nicholas (Adele Achem) female 10 3 Sandstrom, Miss Marguerite Rut female 11 1 Bonnell, Miss Elizabeth female 12 3 Saundercock, Mr. William Henry male 13 3 Andersson, Mr. Anders Johan male .. ... ... ... 20 2 Fynney, Mr. Joseph J male 21 2 Beesley, Mr. Lawrence male 22 3 McGowan, Miss Anna "Annie" female 23 1 Sloper, Mr. William Thompson male 24 3 Palsson, Miss Torborg Danira female [16 rows x 3 columns]
再次,一次完成对行和列的子集选择,仅使用选择括号
[]
不再足够。当特别关注表中基于其位置的某些行和/或列时,请在选择括号[]
前使用iloc
运算符。
当使用 loc
或 iloc
选择特定的行和/或列时,可以为选定的数据分配新值。例如,要将名称 anonymous
分配给第四列的前3个元素:
In [26]: titanic.iloc[0:3, 3] = "anonymous"
In [27]: titanic.head()
Out[27]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 anonymous male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 anonymous female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 anonymous female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
请参阅用户指南中关于 索引的不同选择 部分,以更深入地了解 loc
和 iloc
的使用。
REMEMBER
在选择数据子集时,使用方括号
[]
。在这些方括号内,你可以使用单个列/行标签、列/行标签列表、标签切片、条件表达式或冒号。
使用
loc
进行基于标签的选择(使用行/列名称)。使用
iloc
进行基于位置的选择(使用表格位置)。你可以基于
loc
/iloc
为选择分配新值。
索引的全面概述在用户指南页面中提供,关于 索引和选择数据。