In [1]: import pandas as pd
Data used for this tutorial:
  • 本教程使用存储为CSV的泰坦尼克号数据集。数据由以下数据列组成:

    • PassengerID:每个乘客的ID。

    • 生还:表示乘客是否生还。 0 是的而且 1 不是的。

    • Pclass:3个票类中的一个:类 1 ,班级 2 和班级 3

    • 姓名:乘客姓名。

    • 性别:乘客性别。

    • 年龄:乘客的年龄,以年为单位。

    • SibSp:船上兄弟姐妹或配偶的数量。

    • Parch:船上父母或孩子的人数。

    • 车票:旅客车票号码。

    • 票价:标明票价。

    • 客舱:客舱人数。

    • 已装船:装船港。

    To raw data
    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#

../../_images/03_subset_columns.svg
  • 我对泰坦尼克号乘客的年龄很感兴趣。

    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 ,不使用括号表示属性) SeriesDataFrame 包含行数和列数: (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 是同时具有行维和列维的二维。

To user guide

有关索引的基本信息,请参阅上的用户指南部分 indexing and selecting data

如何从 DataFrame#

../../_images/03_subset_rows.svg
  • 我对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 布尔值(或 TrueFalse ),行数与原始文件相同 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 操作员 &

To user guide

请参阅用户指南中有关以下内容的专用部分 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)
To user guide

有关缺失值的更多专用函数,请参阅用户指南部分 handling missing data

属性中选择特定行和列。 DataFrame#

../../_images/03_subset_columns_rows.svg
  • 我对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. The loc/iloc 选择括号前面需要有运算符 []. When using 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 选择括号前的运算符 []

使用选择特定行和/或列时 lociloc ,可以将新值分配给所选数据。例如,将名称分配给 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
To user guide

请参阅上的用户指南部分 different choices for indexing 要更深入地了解 lociloc

REMEMBER

  • 选择数据子集时,方括号 [] 都是用过的。

  • 在这些方括号中,您可以使用单个列/行标签、列/行标签列表、标签切片、条件表达式或冒号。

  • 使用选择特定行和/或列 loc 使用行名和列名时。

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

  • 您可以根据以下内容为所选内容分配新值 loc/iloc

To user guide

上的用户指南页面中提供了索引的完整概述 indexing and selecting data