In [1]: import pandas as pd
- Titanic data
本教程使用存储为CSV的泰坦尼克号数据集。数据由以下数据列组成:
PassengerID:每个乘客的ID。
生还:表示乘客是否生还。
0
是的而且1
不是的。Pclass:3个票类中的一个:类
1
,班级2
和班级3
。姓名:乘客姓名。
性别:乘客性别。
年龄:乘客的年龄,以年为单位。
SibSp:船上兄弟姐妹或配偶的数量。
Parch:船上父母或孩子的人数。
车票:旅客车票号码。
票价:标明票价。
客舱:客舱人数。
已装船:装船港。
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
是一个属性(请记住 tutorial on reading and writing ,不使用括号表示属性) Series
和 DataFrame
包含行数和列数: (n行、n列) 。Pandas系列是一维的,只返回行数。
我对泰坦尼克号乘客的年龄和性别感兴趣。
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 list 使用列名,而外括号用于从Pandas中选择数据 DataFrame
如上例所示。
返回的数据类型为PandasDataFrame:
In [10]: type(titanic[["Age", "Sex"]])
Out[10]: pandas.core.frame.DataFrame
In [11]: titanic[["Age", "Sex"]].shape
Out[11]: (891, 2)
所选内容返回一个 DataFrame
891行2列。请记住,一个 DataFrame
是同时具有行维和列维的二维。
有关索引的基本信息,请参阅上的用户指南部分 indexing and selecting data 。
如何从 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
条件表达式的输出 (>
,但也 ==
, !=
, <
, <=
,…工作)实际上是一只Pandas Series
布尔值(或 True
或 False
),行数与原始文件相同 DataFrame
。这样的一个 Series
的布尔值可以用于筛选 DataFrame
通过将其放在选择括号之间 []
。仅值为的行 True
将被选中。
我们从以前就知道,最初的泰坦尼克号 DataFrame
由891行组成。让我们检查一下满足条件的行数 shape
属性的结果。 DataFrame
above_35
:
In [15]: above_35.shape
Out[15]: (217, 12)
我对2舱和3舱的泰坦尼克号乘客感兴趣。
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
备注
组合多个条件语句时,每个条件都必须用括号括起来 ()
. Moreover, you can not use or
/and
但需要使用 or
操作员 |
以及 and
操作员 &
。
请参阅用户指南中有关以下内容的专用部分 boolean indexing 或者是关于 isin function 。
我想使用已知年龄的乘客数据。
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)
有关缺失值的更多专用函数,请参阅用户指南部分 handling missing data 。
属性中选择特定行和列。 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
在这种情况下,行和列的子集是一次性生成的,并且只使用选择括号
[]
is not sufficient anymore. Theloc
/iloc
选择括号前面需要有运算符[]
. When usingloc
/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
请参阅上的用户指南部分 different choices for indexing 要更深入地了解 loc
和 iloc
。
REMEMBER
选择数据子集时,方括号
[]
都是用过的。在这些方括号中,您可以使用单个列/行标签、列/行标签列表、标签切片、条件表达式或冒号。
使用选择特定行和/或列
loc
使用行名和列名时。使用选择特定行和/或列
iloc
当使用表格中的位置时。您可以根据以下内容为所选内容分配新值
loc
/iloc
。
上的用户指南页面中提供了索引的完整概述 indexing and selecting data 。