![Python统计可视化之Altair探索分析实践指南(全彩版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/400/43738400/b_43738400.jpg)
1.5 Pandas的数据框(DataFrame)对象的使用方法
在Altair中,使用的数据集要以“整洁的格式”加载。这就需要将原始数据整理成适当的数据结构,才可以使用Altair的API、实例方法和类进行各种场景的分类汇总及统计分组。其中,分类汇总就是统计学中的描述统计,例如,均值、标准差、最大值、最小值、中位数、分位数、计数(count)和求和(sum)等。因此,整洁的数据格式是Altair需要的数据结构,同时,整洁的数据格式也是实现统计可视化的必要环节。Pandas中的DataFrame是Altair使用数据集的数据结构之一。
DataFrame是一种类似Excel或SPSS的表格型数据结构,DataFrame既有行索引,也有列索引,每一行是一个观察记录(case/observation),每一列是一个变量的不同取值(variable values)。创建DataFrame主要使用Python中的字典。下面,我们通过示例说明具体的实现方法。
1.5.1 使用字典创建DataFrame的方法
(1)导入Pandas。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/028-1.jpg?sign=1738886956-2U5IIg2C0IAPQExAz1lcsh0EeUkrHmiW-0-0226edc2140601540b809da05addb069)
(2)定义一个变量,用来存储字典。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/028-2.jpg?sign=1738886956-OMTnqR1ddgOOF40lGN8Wwpt6coqzQdvb-0-38bd0948578b255a51f100c8be75b925)
(3)生成Pandas中的DataFrame。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/028-3.jpg?sign=1738886956-bpVE5n8N0Mfek3EFq1zRxSMhHv7zv5Lm-0-1475289929270c67cfb7e95b7f13ff03)
如果需要查看某些变量的取值情况,则可以给DataFrame增加列索引;如果需要查看某些案例(cases),也称为观测记录(observations),即样本(samples),还可以增加行索引。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/029-2.jpg?sign=1738886956-IWb2qNHqkgUuFZ1LhzXG3OAaf6Cjm9Fo-0-7c14fea7d0a5d90699e71f9531fc15b7)
注意:输出结果中的第1列不是索引数(即下标),而是关键字参数index列表中的元素。由于下标和目前列表中的元素(0和1)相同,可能会误以为它们是一样的。如果查看第3行的观测记录,则可以使用df.loc["two"],但不可以使用df.loc[2]。
如果列索引的字符串不是字典中的键,那么生成的DataFrame中的相应变量的取值就是空值(NaN),例如,使用字符串"name"作为列表columns中的元素。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/029-3.jpg?sign=1738886956-J3vLYL71bonb3x8H24gR4rWjJuilfXCX-0-a27d0dba3ed3efa4086f7a7cb2c50642)
1.5.2 DataFrame的操作方法
对DataFrame而言,可以选择某一列或若干列、某一行或若干行、某一个值或若干个值,也可以查看行索引、列索引、值区域。
下面使用以下代码生成DataFrame,存储在变量df里。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/029-4.jpg?sign=1738886956-HWCC6QcTJDxhvQmLFqMnUtbtGhfZqWMh-0-2bbb9add7c3fd3ca1003c5fac088e712)
查看行索引。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/029-5.jpg?sign=1738886956-AqH9phaiYynUilhmgZHASJzuhiF8rIdm-0-3f3d300f68726aa1396e76bc3a87a89d)
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/030-1.jpg?sign=1738886956-umNndedtsBOvBLfpvQ4YB8lJ3DTjjgGh-0-966a7f9aee78ec8478be8683d42644f0)
查看列索引。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/030-2.jpg?sign=1738886956-dqpSgVDDnExQLR3es7o1ez2fYUZJRrbm-0-f0f593b51c089a0486cac34456a44f65)
查看值区域,也就是不包含行索引和列索引,这是一个二维数组,行和列的索引起始值都是0。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/030-3.jpg?sign=1738886956-qwlSONzybvhKNVHk6DLL9fnYJ6sLvmCW-0-63462c5c24ee27cd0ea137da9d691407)
查看某一列和若干列。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/030-4.jpg?sign=1738886956-aX8a5haXv8GPeciGcs2jFIiVqus2ymEk-0-51119afe4a6587451b9483f767b39967)
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/031-1.jpg?sign=1738886956-5sbes4Is9ZMftbQFjddHtgEIzGw1LfyP-0-1bef599896c67c31c9e4157ff1f5e149)
注意:选择若干列需要将列索引中的元素放在列表中,从而产生双列表。
查看某一行和若干行。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/031-2.jpg?sign=1738886956-mmlvoUS1tHI2NyPAVZ0LaGwSBAyd82ak-0-d60d97d17c5e558be161eeb50e22c1c0)
注意:选择若干行需要将行索引中的元素放在列表里,从而产生双列表。
查看某一个值和若干个值。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/031-3.jpg?sign=1738886956-VsJdWg73RNmUTWF7mdN6X8P1XbQsfA2W-0-2bc2fc0fef4f3418e76e188e29002003)
1.5.3 缺失值的操作方法
对于DataFrame而言,缺失值的识别和处理可以使用Pandas。缺失值的识别和处理是数据清理的重要环节。因此,高效、简便地识别方法和处理流程就显得尤为关键。可以从某一列或若干列、某一行或若干行、某一个值或若干个值等环节入手,高效识别缺失值。
1. 识别缺失值
使用API函数isna()或isnull()可以判断数据框(DataFrame)对象的变量取值是否存在缺失值。使用方法如下所示。
(1)导入需要的包。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/032-1.jpg?sign=1738886956-x2vvzT5VThcJ6oYqPOv80P6QmMoELMCM-0-9e9859fc59ecc3c6566c15b053eda763)
(2)加载数据集cars。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/032-2.jpg?sign=1738886956-ASZ2WnFsrMoBMKqiZBgEPUGDEQ5ymkGV-0-b35797282031843f6ef3fbb09c11cb0f)
(3)判断变量取值是否存在缺失值。输出结果如图1.4和图1.5所示。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/032-3.jpg?sign=1738886956-dqlpeWWMo2QfkODwz1jNYi6MwSApYDDa-0-70f468042b7b343b64176888aa8abfaf)
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/032-01.jpg?sign=1738886956-dE0ISPH8HSJeTeMyZPqyN8h0dbd3qdxY-0-a4328d757a2f7f219c3089ae340bc1c5)
图1.4
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/032-4.jpg?sign=1738886956-l81MchA7fhEcuXPhwtBUyotyMAXt5xFP-0-9c8309c1cd5791606dd6f3a8502da779)
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/033-01.jpg?sign=1738886956-Ncm8XzN97tQE8imMdnni9bStaNTOR0gf-0-4fe3a2133b62ec8ff110839d3ea00434)
图1.5
(4)统计变量取值存在缺失值的数量。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/033-1.jpg?sign=1738886956-CSzhRjDFsQ7NpPIUeNrIUjWaSewU6vym-0-06fe2a0a305231a1b81e5e0440882c44)
(5)计算变量取值不包括缺失值的数量。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/033-2.jpg?sign=1738886956-3b9JXB8zmNdFnlHJiPG09OioT8QPfCai-0-31fc669a4444a7f8539f3b78f46f3f5e)
(6)变量Miles_per_Gallon和变量Horsepower存在缺失值。查看变量Horsepower存在缺失值,并且变量Origin取值是"Europe"的记录。输出结果如图1.6所示。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/034-1.jpg?sign=1738886956-LGGXC1gmV0bTdNKXfC8gC81q6B7L7RNR-0-03cc8f3f6a1cc9fa3ec3ac2e098429bd)
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/034-01.jpg?sign=1738886956-nQS4bO8yo2NkqzJqOdkgovQNEkwDHVPF-0-23e9a070f3f4acc91d0170d7766b2838)
图1.6
(7)使用API函数dropna()剔除包含缺失值的数据记录。这里以前20行数据记录为例,行索引出现间断情形,表明存在缺失值的数据记录已经被剔除,输出结果如图1.7所示。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/034-2.jpg?sign=1738886956-UWgxd5UcS75U6wOWNZTYO4laMVoltUHj-0-45721f42665cfb964ef6980dee19bf5c)
(8)分析剔除包含缺失值的数据记录的数量变化。从属性shape的取值来看,二元元组的行数减少,变量个数没有变化。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/034-3.jpg?sign=1738886956-bIbrMFxUu6WSl9ZccNDSY1frVz6KMd0K-0-c9f49c7607893f4a197f139991e325b4)
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/035-01.jpg?sign=1738886956-yAUGymUSVe8kLW7PU8k2p7pSR6HlZ1No-0-04a897d281f89e5f8c065d36e8644cc5)
图1.7
2. 处理缺失值
使用API函数fillna()填补存在缺失值的变量或数据记录。函数fillna()的参数既可以是数值,也可以是字典。
(1)使用数值0填补存在缺失值的数据记录。这里以前20行数据记录为例,使用数值0填补存在缺失值的数据记录,行索引连续有序,输出结果如图1.8所示。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/035-1.jpg?sign=1738886956-eFTdA8hR2sT2oszT4nRzXLac9WFR87R2-0-da6abd2bc996ffec61fbe9da48317425)
(2)使用变量Miles_per_Gallon的均值填补存在缺失值的变量Miles_per_Gallon。输出结果如图1.9所示。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/035-2.jpg?sign=1738886956-b9FIUt1wLXY3CrR62RY5ziAHOsfbonXN-0-fa43dbf53aa22c42cc5c128a7c77cac1)
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/036-01.jpg?sign=1738886956-uPPENZ9wLaoycdxP6XWY3x3ndXuiQGyG-0-c2df22154871a6482b2b1efe806af720)
图1.8
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/036-02.jpg?sign=1738886956-IrJsBxR6HzhsyrfP4wAvejg2Lkeu5ySk-0-c7594cc054e73646f79e45155a9de22d)
图1.9
(3)在填补存在缺失值的变量Miles_per_Gallon之后,比较变量取值存在缺失值的数量变化。经过比较,只有变量Horsepower存在缺失值。输出结果如下。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/037-1.jpg?sign=1738886956-p7FS1XnMFEN4CXZCm5XxuNxoUIXGPqps-0-926f545db3d4fdc8206eb1b2f3c32fbc)
(4)在填补存在缺失值的变量Miles_per_Gallon之后,比较变量取值不包括缺失值的数量记录的变化。经过比较,只有变量Horsepower存在缺失值。输出结果如下。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/037-2.jpg?sign=1738886956-FmNNmoFFSfPHlGYoXsebzhWwid9p8syK-0-e82af00eb98762c15665320d13f0c2ee)
(5)分别使用均值和最大值填补变量Miles_per_Gallon和Horsepower。不同变量的数据记录数量相同,所有缺失值都填补完成。输出结果如下。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/037-3.jpg?sign=1738886956-6ld7WAvTl1eEHDe2raqbx7GEXnNgOB30-0-b9ca36c4e33ebc9e118b3b36678a8d44)
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/038-1.jpg?sign=1738886956-qqK7rLEbi0Y41fuKJotuAjuYfhmnTb3k-0-45a7e5178eb3faaa8187a47eb4d08957)
(6)使用API函数describe()展示数量型变量的描述统计。输出结果如图1.10所示。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/038-2.jpg?sign=1738886956-jsvbgnAwFGgMPMiIhuEMMASuFgKNG5wJ-0-d402b61bc0c8d9619d6391403bafac01)
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/038-01.jpg?sign=1738886956-9zM7VH9hKZ0X18IqIMJqxy0nsDmdxD5p-0-ac09f9f1cf88ab0ca53622f633215a62)
图1.10
1.5.4 条件查询的操作方法
对DataFrame而言,条件查询可以使用Pandas。条件查询类似MySQL中的where子句,使用条件表达式获得布尔值进而筛选部分数据集或变量。为了更好地演示使用方法,下面使用数据集cars的前30行数据记录作为示例数据集。实现代码如下所示。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/038-3.jpg?sign=1738886956-GmFsXEkEgp6sEtiOI2TzlBiF4dUqeFwy-0-2258a0a90f52019bc022a88da724a376)
查询条件的设置方法,以变量类型划分,主要分为数量型变量、名义型变量和时间型变量。
数量型变量的条件表达式主要使用逻辑运算符“==”、“>=”、“<=”和“!=”等,例如,source.Miles_per_Gallon==14,可以称为精确查询。名义型变量的条件表达式主要使用API函数str.contains()设置查询字符串,例如,source["Origin"].str.contains("Euro"),包含查询字符串的数据记录都会以查询结果的形式返回,可以称为模糊查询。如果使用完整的变量取值,则等价于使用逻辑运算符“==”设置条件表达式,例如,source.Origin=="Europe",属于精确查询。时间型变量的条件表达式主要使用类pandas.Timestamp()设置查询时间戳(日期和时间),例如,source2.Year==pd.Timestamp("1982"),属于精确查询。
(1)查询变量Origin的取值等于"Europe"的数据记录。条件表达式既可以使用source.Origin=="Europe",也可以使用source["Origin"]=="Europe"。条件表达式的返回值是对象Series。条件查询结果如图1.11所示。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/039-1.jpg?sign=1738886956-kYusS1t8gOwbsxf81HP3Yj99GyaPTsln-0-5f20fb2f3217ef0ca32abb107c21ae6a)
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/039-01.jpg?sign=1738886956-Ix8i61XvcV2gLwaX6TC0lXrIAEzJChSl-0-cb2a782a6ba6d116287850078ce06c5c)
图1.11
(2)查询变量Origin的取值等于“Europe”,且变量Miles_per_Gallon的取值大于或等于15的数据记录。两个条件表达式都需要使用“()”,逻辑连接词且使用“&”,逻辑连接词“或”使用“|”。条件查询结果如图1.12所示。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/039-2.jpg?sign=1738886956-wS2eVdR4muz7tP1j9UkCZNN8ZrVvHL7X-0-9cc4450ecb8f5ddb5550639b6fbb9fd0)
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/039-02.jpg?sign=1738886956-fxBWGxmRmmoY93NF6qss2q2madmMeS1x-0-52256bc7e4f8a2d9cb7035c4ac612e43)
图1.12
(3)查询变量Origin的取值等于“Europe”或变量Miles_per_Gallon的取值等于14的数据记录。条件查询结果如图1.13所示。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/039-3.jpg?sign=1738886956-vNw9TT1Txv5B41rEUZMy46SR4yFCEzgz-0-eace8cd632de4628fc98726c31b4849d)
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/040-01.jpg?sign=1738886956-sgdQay2LDD4Z0CppMegavQLOIj6ro96g-0-96ed3d2c38280efbf218c89cc71dee9a)
图1.13
(4)查询变量Origin的取值等于“Europe”或变量Miles_per_Gallon的取值等于14的数据记录。同时,返回的数据记录只显示依次包含变量Name、Miles_per_Gallon和Origin的数据记录。可以根据显示需求调整这些变量在列表中的顺序。条件查询结果如图1.14所示。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/040-1.jpg?sign=1738886956-4SVjJ1lzSckuv3UZnDNKWqmOt6b8YZlq-0-a864334f3eec70d31b1d438956f033e4)
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/040-02.jpg?sign=1738886956-z2wICQyrryyGnPg7zyfLqpedHKvO7ffw-0-cc99192194fd398a4db99c33559561fc)
图1.14
(5)查询变量Miles_per_Gallon的取值大于或等于18,且变量Miles_per_Gallon的取值小于或等于25的数据记录。条件查询结果如图1.15所示。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/040-2.jpg?sign=1738886956-Rtb0edjPqiRqBhhCFJrEdacltzpyWcPT-0-f73ed78b3e197b8b04c75ac31b51e36c)
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/041-01.jpg?sign=1738886956-MM1Xkq4USuPbYhcB7khoaRVWGt1kIGgR-0-694bbd6044974b5942564d802dd0e7c5)
图1.15
(6)查询变量Origin的取值包含“Euro”的数据记录。对名义型变量而言,可以使用API函数str.contains()设置查询条件,判断字符串模式或正则表达式是否匹配名义型变量的取值,返回布尔型对象Series。名义型变量Origin的条件查询结果如图1.16所示。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/041-1.jpg?sign=1738886956-gjV8Xl9dnklBxQNsfXe3NyFni9Ih7ZH9-0-e6c017d3bd7e582c0a3228ba9d05ed26)
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/041-02.jpg?sign=1738886956-qaCMFLRtme7GXbwbz21svOsOeX22Aigz-0-ea6169c4b3eb4e871cbe06312df6b748)
图1.16
(7)查询变量Name的取值包含“for”的数据记录。同时,查询结果的数据记录只包含部分变量。名义型变量Name的条件查询结果如图1.17所示。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/041-2.jpg?sign=1738886956-sa60G3mBxtDqFrCAcNulG5kGrHN7SP6B-0-fb61cf5de042d33305d6c628e4cca862)
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/041-03.jpg?sign=1738886956-9bZfiydyHBeIPZCICQp9MoCadVxO2l2l-0-2b30386651bdc36bbfb77584997de7b8)
图1.17
(8)查询变量Name的取值包含“(”的数据记录。按照正则表达式查询,需要使用"\("。名义型变量Name的条件查询结果如图1.18所示。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/042-1.jpg?sign=1738886956-nAHFKUvrARbNdhrdKySCt3rWVr6mo900-0-edf535a15011a2053a7a44c664dbdc2f)
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/042-01.jpg?sign=1738886956-7QFToHhhLt02HzoB3IKMBTIBMj0CN7MN-0-90f6552224ee2263ecd0a247146a153e)
图1.18
(9)查询变量Name的取值包含“(”的数据记录。按照字符串查询,需要传递False给关键字参数regex。同时,查询结果的数据记录只包含部分变量。名义型变量Name的条件查询结果如图1.19所示。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/042-2.jpg?sign=1738886956-Oqlof8V4cvbnVGuBarGRzAyGJ8i6N2sn-0-47564ddab3528cad9900445bdbed0340)
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/042-02.jpg?sign=1738886956-d2zENi9z6uc1aWWkRlYxd4ULrZ2KeaBz-0-d6dddc7bdf6a583f7f68192e712bc53c)
图1.19
(10)查询变量Year的取值等于1970年的数据记录。对时间型变量而言,可以使用类pandas.Timestamp()设置查询日期和时间。使用完整数据集cars作为查询范围,同时,查询结果的数据记录只包含部分变量。时间型变量Year的条件查询结果如图1.20所示。
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/042-3.jpg?sign=1738886956-ndbM28uDvWQoxatAiTLLpsc0hdkrHpjC-0-0050000ef0f802136beafa4d4e249f6b)
![](https://epubservercos.yuewen.com/A9DFFD/23020653609770806/epubprivate/OEBPS/Images/043-01.jpg?sign=1738886956-JFRuifijsMzZSAB0MXv42Ps3Roz5jToH-0-51628e91627e03270bb7ad36555ca0a3)
图1.20