第二章:Python语言基础与环境 + 第三章:Pandas 数据结构与操作

1. 元组中的元素只能是同一数据类型 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** Python 的元组和列表都可以包含不同数据类型的元素,是异构容器。例如 `(1, "hello", 3.14)` 是合法的。

2. 可以用a={}创建空的集合 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 使用 `{}` 创建的是一个空的字典。要创建空集合,必须使用 `set()` 构造函数。

3. 在Python中,运行代码'5'+5,会生成字符串’55’( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 字符串和整数之间不能直接使用 `+` 运算符,会引发 `TypeError`。

4. 语句20==20.0返回结果是True ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `==` 运算符比较的是值。整数 `20` 和浮点数 `20.0` 的数值相等。

5. 可以将列表作为字典的键 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 字典的键必须是不可变(hashable)的对象。列表是可变的,因此不能作为键。

6. 所有写在“//”号之后的文本会自动被Python解释器忽略 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** Python 的单行注释符号是 `#`。`//` 是整除运算符。

7. 列表中的pop方法可以返回特定位置的元素但是remove不可以( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `.pop(index)` 会移除并返回指定索引的元素。`.remove(value)` 移除指定值,但返回 `None`。

8. 通过isinstance(a, (int, str))可以检测变量a的类型是否在int, str中 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是 `isinstance` 函数的标准用法,其第二个参数可以是一个类型元组。

9. 列表、字典、Numpy数组都是可变(mutable)对象 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这三者都允许在创建后修改其内部的元素或内容。

10. tup=(1,[1,2,3],3); tup[1].append(4)不能执行( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 元组本身是不可变的,但其内部的可变元素(如列表)是可以被修改的。

11. '5'+'3'的结果是’8’( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 字符串使用 `+` 运算符会进行拼接,结果是字符串 `'53'`。

12. 对于对象a=[1,2,3]b=[1,2,3]a is ba==b输出的结果都为True ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `a == b` (值相等) 是 `True`,但 `a is b` (身份标识不同) 是 `False`,因为它们是两个独立的对象。

13. d={}; d[tuple([1, 2, 3])] = 5语句不能执行( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 元组是不可变的,可以作为字典的键,该语句合法。

14. 函数柯里化的过程中,如果传入的参数数量不足,剩下的参数将默认为空值传入( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 它会返回一个等待接收剩余参数的新函数。

15. 运行以下代码,4 > 3 > 2 > 1,将返回True( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** Python 支持链式比较,该表达式等价于 `(4 > 3) and (3 > 2) and (2 > 1)`。

16. 下列这句代码是对的:test_data = 1, ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 结尾的逗号会使 Python 将其解释为一个单元素元组 `(1,)`。

17. Python中不可以使用java中表示语句块的“{}”,以及分隔符“;” ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** Python 不使用 `{}` 表示语句块,但可以使用分号 `;` 在同一行分隔多个语句。

18. (4,None,'foo')+(6,0)+('bar')不能执行 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `('bar')` 只是一个带括号的字符串,不是元组。元组和字符串不能相加,会引发 `TypeError`。正确的单元素元组应写为 `('bar',)`。

19. 设a = ’python’,可以执行a[0]=‘P’ ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 字符串是不可变对象,不能通过索引赋值来修改内容。

20. NoneNoneType类型的唯一实例 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是 `None` 的正确定义。

21. 像Java语言一样,Python语句也是以分号结尾的 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** Python 语句以换行符作为默认的终止符。

22. 对于含有换行的多行字符串,可以使用三个单引号’’’或者三个双引号””” ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是 Python 定义多行字符串的标准语法。

23. 表达式“[3] in [1, 2, 3, 4]”的值是True.( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `in` 运算符检查的是元素。列表 `[1, 2, 3, 4]` 包含整数 `3`,但不包含列表 `[3]`。

24. def choise(x,y,z=5): choise(5,z= 2,y = 3) 可以调用 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `5` 作为位置参数赋给了 `x`,`y=3` 和 `z=2` 作为关键字参数赋值。所有参数都得到了明确且无冲突的赋值。

25. num1=num2=num3=20 在内存中指向不同的变量地址( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 链式赋值使 `num1`, `num2`, `num3` 都指向内存中同一个存放整数 `20` 的对象。

26. 使用pop( )方法删除列表中某一元素后,该元素从栈顶被推出且无法再访问。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `pop()` 方法会返回被删除的那个元素,可以将其赋值给变量以备后续使用。

27. 在Python中可以使用 id 作为变量名 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `id` 是一个内置函数,但不是关键字。因此可以作为变量名,但这会覆盖内置函数,是不推荐的做法。

28. 列表的插入函数insert()指定的序号可以大于数组长度。 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 如果 `index` 大于列表长度,`insert()` 会将元素插入到列表的末尾,效果等同于 `append()`。

29. List中的remove()函数会移除列表中指定的所有的元素。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `.remove(value)` 只会移除列表中第一个匹配到的 `value`。

30. 用 sort 函数可以产生一个排好序的序列副本。 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 列表的 `.sort()` **方法**是原地排序,返回 `None`。而内置的 `sorted()` **函数**才会产生一个排好序的副本。

31. tup1=(1,2,3,4,5);a , b , *rest = tup1;type(rest);结果为 tuple 。 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 在解包赋值中,带星号的 `*rest` 会将所有剩余的元素打包成一个列表 (list)

32. set([2,[2,3,4]])的输出结果是{2,[2,3,4]}。 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 集合的元素必须是可哈希的。列表 `[2,3,4]` 是可变的,不能放入集合中,会引发 `TypeError`。

33. type((1))type(())的输出都是tuple ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `type(())` 是 `tuple`,但 `(1)` 只是一个带括号的整数,`type((1))` 是 `int`。

34. 已经a=[1,2,3,4,5], b=[6,7,8,9],则a.append(b)的输出结果是[1,2,3,4,5,6,7,8,9] ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `.append(b)` 会将整个列表 `b` 作为一个单一元素添加到 `a` 的末尾,结果是 `[1,2,3,4,5, [6,7,8,9]]`。应使用 `.extend(b)` 或 `a + b` 来拼接。

第四章:NumPy 数组与操作

1. ndarray包含的每一个元素均为相同类型。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是 NumPy 数组(`ndarray`)的核心特性之一。它是一个同构数据容器,所有元素必须是相同的数据类型(如 `int64`, `float64` 等),这使得 NumPy 能够进行高效的批量运算。(旧版专门测试过是可以异构,但新版已经只能同构。所以答案是T)

2. import numpy as np, arr=np.arange(10), arr.astype(float), print(arr),输出结果为[0 1 2 3 4 5 6 7 8 9]。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `arr.astype(float)` 方法会返回一个新的、数据类型为浮点数的数组副本,它并不会原地修改 `arr` 本身。因此,`print(arr)` 打印的仍然是原始的整数数组。

3. 嵌套序列能被转换为多维数组( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `np.array()` 函数可以将嵌套的列表或元组(如 `[[1,2],[3,4]]`)转换为多维 NumPy 数组。

4. NumPy中的random函数中的randn()可以产生N(0,1)的数( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `np.random.randn()` 函数用于生成服从标准正态分布(均值为0,方差为1,即 N(0,1))的随机数。

5. 使用np.unique函数可以对NumPy数组进行去重。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `np.unique(arr)` 会找出数组 `arr` 中的唯一元素,并返回一个已排序的新数组。

6. 两个大小相等数组之间的算术运算,都是“点对点”的运算。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是 NumPy 的核心特性,也称为元素级 (element-wise) 运算。数组间的算术运算会作用于对应位置的元素。

7. 可以通过numpy中的astype方法显式地转换数组的数据类型。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `arr.astype(new_dtype)` 是转换 NumPy 数组数据类型的标准方法。

8. np.arange()是python内建函数的range的数组版( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `np.arange()` 的功能与 `range()` 类似,但它返回的是一个 NumPy 数组,而不是一个迭代器,并且它支持浮点数步长。

9. arr.mean(1)计算的是每一列的平均值,arr.sum(0)计算行轴向的累和( )

点击查看解析
**正确答案:** 错误 (False)

**解析:**
  • `axis=1` 表示沿着的方向进行计算,因此 `arr.mean(1)` 计算的是每一的平均值。
  • `axis=0` 表示沿着的方向进行计算,因此 `arr.sum(0)` 计算的是每一的和。

10. 数组的切片就是将原数组的数据复制,对切片的修改不会影响原数组( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** NumPy 数组的切片返回的是原始数组的视图 (view),而不是副本。对切片(视图)的修改会直接影响到原始数组。

11. 数组生成函数array将输入数据转化为ndarray,默认复制所有的输入数据.( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `np.array()` 函数默认会创建一个输入数据的副本,除非输入本身就是一个 `ndarray` 且 `copy=False`。

12. 运用arr.ndim可以查看数组arr的秩。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `.ndim` 属性返回数组的维度数,即秩 (rank)。

13. 同尺寸数组之间直接的比较会产生一个布尔值。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 数组间的比较是元素级的,会产生一个与原数组形状相同的布尔数组,而不是单个布尔值。

14. data=np.random.randn(2,3),则data.ndim的输出结果是3( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `np.random.randn(2, 3)` 创建的是一个 2 行 3 列的二维数组。因此,其维度数 `.ndim` 是 2。

15. NumPy中的zeros方法和empty方法本质是一样的,都是创建一个全0的数组 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `np.zeros()` 创建并初始化一个全为 0 的数组。`np.empty()` 只分配内存空间,不进行初始化,其内容是内存中残留的“垃圾值”,是不确定的。

16. np.sort方法对数组按位置进行排序。( )

点击查看解析
**正确答案:** 错误 (False)

**解析**: `np.sort()` 是一个函数,它返回一个排好序的数组副本,不改变原数组。对数组进行原地排序的是 `.sort()` **方法**。

17. 用NumPy数组对象的reshape方法变换维度时会改变原数组。 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `.reshape()` 方法返回一个具有新形状的视图,如果可能的话。它不会改变原始数组的形状。

18. bool = np.array(...),则(bool>0).any()返回True。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 在数值比较中,`True` 被当作 1,`False` 被当作 0。`bool>0` 会产生一个布尔数组,其中原为 `True` 的位置现在也是 `True`。因为结果中至少有一个 `True`,所以 `.any()` 返回 `True`。

19. 使用布尔值索引选择数据时,生成的是数据的视图 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 布尔索引和花式索引(整数数组索引)总是返回数据的副本,而不是视图。

20. 多维Numpy数组的修改元素操作可使用tuple,例如arr2d[(0,0)]=0。 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 使用元组 (tuple) 来指定多维数组中元素的位置是 NumPy 的标准索引方式。`arr2d[(0,0)]`(通常简写为 `arr2d[0,0]`)会精确地选中第 0 行第 0 列的元素,并可以对其进行赋值修改。

21. 对一个array数组进行reshape操作,作用对象的数组形状会发生改变。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 此题与第17题类似。`.reshape()` 返回一个新形状的视图或副本,原始数组的形状不变。

22. 下面代码会报错。arr=[1,2,3];np.sqrt(arr,arr)( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `np.sqrt(arr, out=arr)` 的第二个参数是输出位置。但 `arr` 是一个 Python 列表,而不是 NumPy 数组。NumPy 的 ufunc (如 `np.sqrt`) 通常不能直接将结果写回 Python 列表。即便 `arr` 是 NumPy 数组,如果它是整数类型,将浮点数结果写回整数数组也会导致类型错误。

23. numpy的方法dot*计算方式没有差别。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `*` 是元素级乘法。`np.dot()` 是矩阵乘法(或向量内积)。两者计算方式和结果完全不同。

24. numpy的mean()函数只能对一维数组使用( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `mean()` 函数可以对任意维度的数组使用,并且可以通过 `axis` 参数指定沿哪个轴计算均值。

25. 如果a.shape=(2,3,4),那么a.mean(1).shape=(2,3)( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `a.mean(1)` (或 `axis=1`) 会沿着第 1 轴进行聚合,该轴会被“压缩”掉。原形状 `(2,3,4)`,去掉第 1 轴后,结果形状应为 `(2,4)`。

26. 输入np.empty(10)的结果为:array([0., 0., ..., 0.]) ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `np.empty()` 只分配内存,不初始化。其内容是内存中的“垃圾值”,是不确定的,通常不是全0。

27. 随机数生成器中的随机数种子相同可以产生不同的随机数组。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 设置相同的随机数种子 (`np.random.seed(...)`) 会保证后续生成的随机数序列是完全相同、可复现的。

28. 对Numpy 数组切片的修改并会影响原数组。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 此题与第10题类似。NumPy 数组的切片是视图,修改切片就是修改原始数组的对应部分。

29. 一个数组对象的itemsize,返回的值是由数组的大小决定的( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `.itemsize` 返回的是数组中单个元素占用的字节数,它由数组的数据类型 (`dtype`) 决定,与数组的大小(元素总数 `.size`)无关。

30. 已知x=np.array([3,5,1,9,6,3]),那么表达式np.argmax(x)的值为3( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `np.argmax()` 返回数组中最大值的第一个出现位置的索引。数组中的最大值是 9,其索引为 3。

31. ar = np.arange(9).reshape(3,3)ar[:2,0] 会生成一维数组( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `ar[:2, 0]` 中,列索引是单个整数 `0`,这会导致降维。结果是选择了前两行的第 0 列元素,形成一个一维数组 `[0, 3]`。

32. x=np.array([[0,1,2,3,4],[,5,6,7,8]]);x.shape。输出结果是(2,5)( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 代码 `[,5,6,7,8]` 中,第一个逗号前缺少一个值,这是语法错误 (SyntaxError),代码无法运行。

33. arr=[4,-1,9,16];np.sqrt(arr);arr 以上代码输出的结果为array([2,nan,3,4]) ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `np.sqrt(arr)` 会返回一个新的计算结果数组,但不会修改原始的 Python 列表 `arr`。所以最后打印 `arr` 仍然是 `[4, -1, 9, 16]`。

34. 与列表不同,数组中要求所有元素的dtype是一样的,如果传入的参数类型和数组类型不一样,需要按照已有的类型进行转换。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是对 NumPy 数组同构性和类型转换的准确描述。例如,向一个整数数组的某个位置赋浮点数,该浮点数会被截断为整数。

35. np.zeros()生成的矩阵元素属性是Int ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `np.zeros()` 默认生成的元素类型是浮点数 (`float64`)。要生成整数,需要明确指定 `dtype`,如 `np.zeros(..., dtype=int)`。

第五章:Pandas 核心功能

1. pd.isnull(frame)pd.notnull(frame)方法可以判断DataFrame对象frame中的元素是否缺失,返回布尔值DataFrame。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这两个函数(或等价的 `.isnull()` 和 `.notnull()` 方法)都会返回一个与原始 DataFrame 形状相同的布尔型 DataFrame,用于标识每个元素是否为缺失值。

2. 针对DataFrame在行上的标签索引iloc是左闭右开区间,loc是左闭右闭区间。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 这个叙述是错误的。`.iloc` 是基于整数位置的索引,它是“左闭右开”的。`.loc` 是基于标签的索引,它是“左闭右闭”的。题目中将 `iloc` 描述为“标签索引”是错误的。

3. 在DataFrame中,当A是有效的Python变量名时,frame[‘A’]frame.A返回的结果是相同的( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是 Pandas 中两种访问列的方式。字典式 `frame['A']` 总是有效,而属性式 `frame.A` 只有在列名是有效 Python 标识符时才有效。当两者都有效时,返回结果相同。

4. pandas中的Series数据结构可以认为是一个长度固定且有序的字典( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** Series 将一个值序列和一个索引序列对应起来,这在概念上与有序字典(从Python 3.7+开始,字典默认有序)非常相似,其中索引是键,值是值。

5. pandas.to_datetime(date).year可以实现从时间序列(data)中提取年份( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `pd.to_datetime()` 返回的是 `Timestamp` 或 `DatetimeIndex`。要从这些对象中提取年份,需要使用 `.dt` 访问器(对于 Series)或直接访问 `.year` 属性(对于单个 Timestamp)。正确的写法应为 `pd.to_datetime(data).year` (对于单个值) 或 `pd.to_datetime(data).dt.year` (对于Series)。

6. 设有s = pd.Series(np.arange(3)),则s.loc[:1]s.iloc[:2]s[:2]输出的结果不一样( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `s` 的索引是 `[0, 1, 2]`。
  • `s.loc[:1]`:标签切片,左闭右闭,选择标签 0 和 1。
  • `s.iloc[:2]`:位置切片,左闭右开,选择位置 0 和 1。
  • `s[:2]`:标准的 Series 切片,当索引为整数时,行为与位置切片相同,选择位置 0 和 1。
这三者输出的结果都是相同的。

7. 从DataFrame中选取的列是数据的视图,而不是拷贝。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 通常情况下,使用 `df['col_name']` 这种方式选择单列返回的是原始 DataFrame 的视图。对这个视图进行修改会影响原始 DataFrame,并可能触发 `SettingWithCopyWarning`。

8. df1 = ... 其中df1.iloc[2:1]=8 ( )

点击查看解析
**解析:** 此题缺失判断。但 `df1.iloc[2:1]` 是一个空的切片(起始位置在结束位置之后),对空切片赋值不会修改 DataFrame,也不会报错。

9. 包含Series的字典可以用于构造DataFrame( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是创建 DataFrame 的一种常见且有效的方式。字典的键会成为列名,Series 的值成为列数据,Pandas 会自动对齐 Series 的索引。

10. obj = pd.Series(...), obj.sort_values(),此操作会将obj中所有的缺失值都放到它的尾部。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `.sort_values()` 方法的 `na_position` 参数默认为 `'last'`,即缺失值 (`NaN`) 会被放在排序结果的末尾。

11. 如果嵌套字典被赋值给DataFrame,pandas会将字典的键作为列,内部字典的键作为行索引( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是 `pd.DataFrame()` 处理嵌套字典的标准行为,例如 `pd.DataFrame({'col1': {'row1': 1}})`。

12. pd.DataFrame(np.arange(9).reshape((3,3))))可以建立3列3行的DataFrame。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `np.arange(9).reshape((3,3))` 创建一个 3x3 的 NumPy 数组,`pd.DataFrame()` 可以直接接受这个二维数组来创建一个 3x3 的 DataFrame。

13. 将Series赋值给DataFrame的一列时,Series的索引会按照DataFrame的索引重新排列,并在空缺的地方填充缺失值。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是 Pandas 的核心特性之一:自动对齐索引。赋值时,Pandas 会根据 DataFrame 的行索引来匹配 Series 的索引,如果某个 DataFrame 索引在 Series 中找不到,对应位置就会被填充为 `NaN`。

14. 在pandas中,通过isnullnotnull函数检查缺失数据,返回的结果是一样的( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `isnull()` 和 `notnull()` 的功能正好相反。`isnull()` 在缺失值位置返回 `True`,而 `notnull()` 在非缺失值位置返回 `True`。

15. ser=pd.Series(np.arange(3.))ser.loc[:1]ser.iloc[:1]的结果是一样的( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `ser` 的索引是 `[0, 1, 2]`。
  • `ser.loc[:1]`:标签切片,左闭右闭,选择标签 0 和 1。结果包含两个元素。
  • `ser.iloc[:1]`:位置切片,左闭右开,只选择位置 0。结果包含一个元素。
两者结果不同。

16. ['c':'d']是无效的索引 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 对于 Pandas 的 Series 或 DataFrame,如果其索引是字符串标签,那么 `['c':'d']` 这种形式的标签切片是完全有效的。

17. 对DataFrame中选取的列进行修改不会映射到DataFrame中。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 选取的列通常是视图,对其进行修改映射回原始的 DataFrame。

18. DataFrame的 values属性会把包含在DataFrame中的数据以NumPy数组的形式返回( )

点击查看解析
**正确答案:** 正确 (True)

**解析**:这是 `.values` 属性(在新版中推荐使用 `.to_numpy()`)的标准功能。

19. 对于索引值为[‘a’,’b’]的Series对象obj,可以使用obj[1]获取值 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 当 Series 的索引是非整数类型时,整数索引会被明确地解释为位置索引。`obj[1]` 会获取第二个元素。

20. 4 in pd.Series([4,7,-5,3])返回的结果是True。 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `in` 运算符对于 Series 检查的是索引,而不是值。由于该 Series 的索引是 `[0, 1, 2, 3]`,不包含 `4`,所以返回 `False`。要检查值,应使用 `4 in series.values`。

21. obj=...;对于obj的切片,obj["b":"c"],其输出值为 b 1.0。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 标签切片 `obj["b":"c"]` 是“左闭右闭”的,会包含标签 `'b'` 和 `'c'` 的所有行。结果应为 `'b': 1.0, 'c': 2.0`。

22. 已知obj2 = ...,输入obj2['a':'f'],会正确执行。 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `obj2` 的索引 `['d', 'b', 'a', 'c']` 是无序的。对无序索引进行标签切片,Pandas 无法确定 `'a'` 和 `'f'` 之间的范围,会引发 `KeyError`。

23. states = ('California', ...)states = ['California', ...]都可以执行的。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 第一条语句创建元组,第二条创建列表,都是合法的 Python 语法。

24. 从DataFrame中选取的列是数据的拷贝,而不是视图。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 此题与第7题类似。选取的列通常是视图。

25. Series中的索引值可以重复;DataFrame每列内需是相同的值类型。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这两个都是 Pandas 数据结构的基本特性。

26. a1是一个Series,a2是一个DataFrame,他们都属于Pandas,但是a1.valuesa2.values返回的数据类型不一样( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 两者的 `.values` 属性都返回一个 NumPy `ndarray` 对象。区别在于维度,`a1.values` 是一维的,`a2.values` 是二维的,但它们的类型都是 `numpy.ndarray`。

27. 对pandas对象进行切片时:按Label索引进行切片…( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这个叙述准确地总结了 Pandas 切片的三条规则。

28. del在DataFrame中只能够删除列不能够删除行。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** Python 的 `del` 关键字与 Pandas 结合使用时,`del df['col']` 是删除列的有效语法。但没有 `del df[row_index]` 这种删除行的语法,删除行必须使用 `.drop()` 方法。

29. 已知有一个DataFrame对象,可以直接用切片索引它的行列( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `df[...]` 这种直接切片操作是针对的。要同时索引行和列,必须使用 `.loc` 或 `.iloc` 索引器,如 `df.loc[row_slice, col_slice]`。

第六章:数据输入输出与接口

1. 用pandas读取文件时不指定列名时,会报错( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 不指定列名时,Pandas 的 `read_csv` 等函数会默认将文件的第一行作为列名。如果文件没有列名行,可以设置 `header=None`,Pandas 会自动生成整数列名。

2. pd.read_csv('examples/ex2.csv', header=0)header = 0表示取文件中的第一行作为列名。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `header` 参数指定用作列名的行号,索引从 0 开始。`header=0` 明确表示使用文件的第一行作为列名,这也是 `read_csv` 的默认行为。

3. 使用read_csv方法读取文件时,可以通过指定chunksize进行分块读入文件( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `chunksize` 参数用于处理大文件,它会返回一个 `TextFileReader` 对象,可以通过迭代该对象来逐块读取数据。

4. csv产生的数据都是字符串类型的,它不会做任何其它类型的转换( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `read_csv` 会自动进行类型推断,尝试将列转换为数值类型(如 `int64`, `float64`)或日期时间类型。

5. 使用json.loads方法可以将JSON字符串转化为python形式,使用json.dumps可以将python对象转化为JSON。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `json.loads` (load string) 用于反序列化,`json.dumps` (dump string) 用于序列化。

6. DataFrame中的to_csv方法只能导出逗号分隔的文件( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `to_csv` 方法可以通过 `sep` 参数指定任意分隔符,例如 `sep='\t'` 可以导出制表符分隔的文件。

7. JSON对象中的键可以是int形式( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 根据 JSON 规范,对象的键 (key) 必须是字符串。虽然 Python 字典的键可以是整数,但在序列化为标准 JSON 格式时,这些整数键会被转换为字符串。

8. 当要读入的文件没有列名时,可以设置关键字header=None( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `header=None` 明确告诉 Pandas 文件没有列名行,应将所有行都作为数据读取,并自动生成整数列名。

9. 读取的字段由多种不同数量的空格分开时,我们可以通过向sep传入正则表达式来进行读取( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 当分隔符不固定时,可以使用正则表达式。例如,`sep='\s+'` 可以匹配一个或多个空格作为分隔符。

10. CSV文件在写入的时候data1=data.to_csv(...),其中sep参数用于制定分隔符( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `to_csv` 的 `sep` 参数用于指定输出文件中的字段分隔符。

11. 使用read_csv()函数必须从头开始逐行读取( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 可以通过 `skiprows` 参数跳过文件开头的任意行,或通过 `skipfooter` 跳过结尾的行。

12. 将pandas数据写入到Excel格式中必须直接调用ExcelWriter( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 最简单的方式是使用 DataFrame 的 `.to_excel()` 方法。只有当需要向同一个 Excel 文件的多个工作表中写入数据时,才需要显式地使用 `ExcelWriter`。

13. pandas中的函数read_html在默认的情况下会解析一个html页面中的所有标签,返回的结果是DataFrame对象的列表 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `pd.read_html()` 会尝试在 HTML 页面中找到所有 `` 标签,并将每个表格都解析成一个 DataFrame,最后将这些 DataFrame 放在一个列表中返回。

14. 语句options.display.max_rows可以调整pandas的最大显示行数,设置显示最开始的行数.( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `pd.options.display.max_rows` 设置的是当 DataFrame 行数超过该值时,Pandas 如何截断显示(例如,显示头尾几行)。它设置的是总的显示行数阈值,而不是只显示最开始的行数。要只看最开始的几行,应使用 `.head(n)` 方法。

15. 使用read_csv()方法读入文件的时候,默认的分隔符是”,”。 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `read_csv` 的 "csv" 就代表 "Comma-Separated Values",其 `sep` 参数默认值为 `','`。

16. na_values可以接受一组用于表示缺失值的字符串 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `na_values` 参数可以接受一个列表或集合,其中包含所有需要在读取时被转换成 `NaN` 的字符串。

17. 在字典中,每列不可以指定不同的缺失值标识。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 可以向 `na_values` 传入一个字典,其中键是列名,值是该列特定的缺失值标识。例如 `na_values={'col_A': ['missing'], 'col_B': [-1]}`。

18. 当要读入的文件没有列名时,可以设置关键字header=None ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 此题与第 8 题相同,叙述正确。

19. 使用read_table方法读取文件时,可以传入seq参数指定分隔符 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 指定分隔符的参数是 `sep` 或 `delimiter`,不是 `seq`。

20. pd.read_csv('test.csv',skiprows=1)没有语法错误。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `skiprows=1` 是 `read_csv` 的有效用法,表示跳过文件开头的 1 行。

21. 在read_csv的参数中,skiprows传入的行号必须为列表形式( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `skiprows` 既可以是一个整数(表示从文件开头跳过 N 行),也可以是一个行号列表。

22. 读入文件时,行和列的标签不可以禁止写入。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 在使用 `.to_csv()` 等写入方法时,可以通过设置 `header=False` 来禁止写入列标签,通过设置 `index=False` 来禁止写入行标签。

23. 当读取的txt文件中列名的数量比数据的列数少一个,因此read_table推断第一列应当作为DataFrame的索引。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是 Pandas 解析器的一个智能推断行为。当发现列标题行比数据行的字段数少一个时,它会假定第一列没有标题,并将其用作行索引。

24. panda.read_json只能自动将JSON数据集按指定次序转换为Series( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `pd.read_json` 默认会将 JSON 对象或数组转换为 **DataFrame**。只有在特定格式或设置下才会转换为 Series。

25. ...nrows=5...chunker.get_chunk(5) 输出结果一样( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `nrows=5` 直接读取文件的前 5 行数据。`chunker = ...chunksize=1000` 创建一个迭代器,`chunker.get_chunk(5)` 从这个迭代器中获取一个大小为 5 行的块。两者都会得到包含文件前 5 行数据的 DataFrame。

26. 使用read_table函数时,可以使用一个正则表达式作为分隔符。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `read_table` 和 `read_csv` 的 `sep` 参数都支持正则表达式。

27. read_csv中的参数header默认为None ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `header` 的默认值是 `0`,表示将文件的第一行作为列名。

28. 为了分块读入文件,可以使用chunksize作为每一块的行数 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 此题与第 3 题类似,叙述正确。

29. HDF不是事务数据库,它最适合用作”一次写多次读“的数据集 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** HDF5 (Hierarchical Data Format) 是一种文件格式,不是数据库。它为高效读写大量科学数据而设计,非常适合“一次写,多次读” (WORM) 的场景。

30. Pd.read_csv()方法中,参数headernames同时设置最终以names作为基准设置列标签 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 当 `names` 被指定时,它会覆盖 `header` 的作用。`header` 参数此时只用来告诉 Pandas 文件中的哪一行是旧的列名行,以便可以跳过它。

31. 当要读入的文件没有列名时,可以设置关键字header=0 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `header=0` 是默认行为,它会把文件的第一行当作列名。如果文件没有列名,这样做会导致第一行数据被错误地用作列名。正确的做法是设置 `header=None`。

第七章:数据清洗与转换

1. 使用cut方法需要制定具体的边界。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `pd.cut()` 不仅可以接受一个具体的边界列表作为 `bins` 参数,也可以接受一个整数,`cut` 会自动根据数据的最大最小值将范围等分成指定数量的等宽区间。

2. data = pd.Series(...)data.str.replace('a','d')其中9会被处理为Nan ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `.str` 访问器下的方法(如 `.replace`)是为字符串设计的。当 Series 中包含非字符串类型的值(如整数 `9`)时,这些方法在这些值上的操作结果是 `NaN`。

3. 默认情况下,fillna方法可以传入指定值来补全缺失值,从而修改了原对象( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `fillna()` 方法默认 `inplace=False`,它会返回一个填充了缺失值的新对象,而不修改原始对象。

4. 在删除dataframe的某一行时,设置关键词inplace=True可以覆盖原有的数据。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 在 Pandas 的许多方法中(如 `.drop()`, `.fillna()` 等),设置 `inplace=True` 会使操作直接在原始对象上生效,并返回 `None`。

5. 对于DataFrame对象,dropna在默认情况下会删除所有值均为NA的行( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `dropna()` 的 `how` 参数默认为 `'any'`,这意味着它会删除任何包含 `NaN` 的行,而不是只删除所有值均为 `NaN` 的行。

6. data.dropna(how='all')可以删除data中所有包含NA的行( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `how='all'` 表示只删除那些所有值都为 `NaN` 的行/列,而不是所有包含 `NaN` 的行/列。

7. mapreplace都可以用于修改一个对象中的子集的值( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `map` 可以通过字典对 Series 中的每个元素进行映射替换。`replace` 也可以通过字典或列表来替换对象中的一个或多个值。两者都可以用于修改值的子集。

8. 处理缺失数据时可以用dropna()方法直接过滤缺失值( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `dropna()` 的核心功能就是删除(过滤掉)含有缺失值的行或列。

9. Data为Series类型,操作data[data.notnull()]data.dropna()是等价的。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `data.notnull()` 返回一个布尔 Series,其中非缺失值位置为 `True`。使用这个布尔 Series 进行索引,会筛选出所有非缺失值。这与 `.dropna()`(默认删除所有含 `NaN` 的行)的效果是完全等价的。

10. 使用pandas的cut操作返回的是一个DataFrame对象。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `pd.cut()` 返回的是一个特殊的 **Categorical** 对象,它本质上像一个 Series,其值是表示区间的 `Interval` 对象。

11. pandas的索引中不可以包含重复标签( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 与 Python 集合不同,Pandas 的 Index 对象可以包含重复的标签。

12. Python中in关键字、index方法、find方法都可以检查子字符串( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `in` 返回布尔值,`index` 和 `find` 返回索引位置(或在找不到时报错/返回-1),但它们都可以用来检查子字符串是否存在。

13. fillna()方法可以传入字典,实现对不同列的缺失值用不同的值进行填充( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是一个 `fillna` 的常用功能。例如 `df.fillna({'col_A': 0, 'col_B': 'missing'})`。

14. DataFrame中的列索引是自动从1开始的( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 如果不指定,DataFrame 的行索引和列索引都是自动从 0 开始的整数索引。

15. pandas中如果我们不为Series对象指定索引,程序会报错( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 如果不指定索引,Pandas 会自动创建一个从 0 开始的整数 `RangeIndex`。

16. NA和NaN的意思都是一样的 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 在 Pandas 的语境中,NA (Not Available) 是表示缺失数据的通用概念,而 `NaN` (Not a Number) 是其在数值类型(特别是浮点数)中的具体实现。它们通常可以互换使用来指代缺失值。

17. data.index[0]='aaa'可以将data中第0行的索引变为aaa ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** Pandas 的 Index 对象是不可变的 (immutable),不能通过索引赋值来修改其内容。这会引发 `TypeError`。

18. 通过index方法查找指定字符的位置,如果字符不存在会返回-1。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 字符串的 `.index()` 方法如果找不到子字符串,会引发 `ValueError`。返回 -1 的是 `.find()` 方法。

19. drop_duplicates函数删除重复行,默认保留第一个观测到的值。 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `drop_duplicates` 的 `keep` 参数默认为 `'first'`。

20. 对于存放数值型数据的DataFrame对象,调用describe方法可以返回各个列的统计数据 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `.describe()` 默认会对 DataFrame 中所有数值类型的列计算描述性统计。

21. Python内建的None值在对象数组中也被当作NA处理。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** Pandas 会将 `None` 识别为缺失值。在 `object` 类型的数组中,它会保持为 `None`,但在 `isnull()` 等函数中会被当作 `NA`。如果数组是数值类型,`None` 会被强制转换为 `NaN`。

22. 使用rename方法对DataFrame对象df进行重命名将会返回一个新的对象。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `.rename()` 方法默认 `inplace=False`,返回一个重命名了索引或列的新 DataFrame 对象。

23. pandas中用cut函数进行分箱得到的分组区间只能是前开后闭( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `cut` 默认是左开右闭 `(a, b]`,但可以通过设置 `right=False` 来实现左闭右开 `[a, b)`。

24. pandas中的cut函数可以通过传入参数实现两端均封闭。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 可以通过 `include_lowest=True` 参数来确保第一个区间的左边界是封闭的。例如,`pd.cut(data, bins=[0,1,2], include_lowest=True)` 会产生 `[-0.001, 1.0]` 和 `(1.0, 2.0]`。

25. 在DataFrame对象中,使用fillna来补全缺失值时,返回的是一个新对象。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 此题与第3题类似。`fillna` 默认 `inplace=False`,返回新对象。

26. dropna 默认情况下会删除包含缺失值的列。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `dropna` 的 `axis` 参数默认为 `0`,即默认删除包含缺失值的

27. 语句np.sign(data)根据数据中的值的正负分别生成0和1的值 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `np.sign()` 会返回:正数 -> `1`,负数 -> `-1`,零 -> `0`。

28. dropna()函数的axishow参数的默认值分别为0,any( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `axis` 默认为 0 (行),`how` 默认为 'any' (任何一个 `NaN` 就删除)。

29. fillna方法的参数可以传入字典为不同列设置不同的填充值 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 此题与第13题类似,叙述正确。

第八章:数据合并与重塑

1. 默认情况下,concat方法是沿着axis=0的轴向生效的( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `pd.concat` 的 `axis` 参数默认为 `0`,表示沿行方向进行拼接(垂直堆叠)。

2. NumPy中的concatenate函数默认情况下是进行横向拼接( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `np.concatenate` 的 `axis` 参数默认为 `0`,表示沿第一个轴(行方向)进行拼接(垂直堆叠),而不是横向拼接(`axis=1`)。

3. merge函数会在没有指定连接键的情况下,自动将重叠列名作为连接的键( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 如果不通过 `on`, `left_on`, `right_on` 等参数指定连接键,`pd.merge` 会自动使用两个 DataFrame 中共有的列名作为连接键。

4. 如果不是所有的级别值都能在各分组中找到,则unstack操作会引入缺失数据( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `unstack` 在将索引层级旋转到列时,如果某个新的行列组合在原始数据中不存在,该位置就会用 `NaN` 填充。

5. swaplevel接收两个层级序号或名称,将原对象的层级进行变更。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `swaplevel` 会返回一个层级交换后的新对象,而不改变原对象。

6. 分层索引中“内部层级”是不可以选择的 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 可以通过多种方式选择内部层级,例如使用元组 `df.loc[('outer_key', 'inner_key')]`,或者通过 `.xs()` 方法。

7. 在DataFrame中拆堆时,被拆堆的层级会变为结果中最低(level最大)的层级( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `unstack` 会将指定的行索引层级移动到列索引中,并成为新的列索引层级中的最内层(即最低层级)。

8. DataFrame的join方法,能更为方便地实现按索引合并…但要求没有重叠的列( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `.join()` 是一个方便的按索引连接的方法。如果两个 DataFrame 有重叠的列名,`join` 会引发 `ValueError`,除非你使用 `lsuffix` 或 `rsuffix` 参数来区分它们。

9. 一个分层索引的Series对象使用unstack方法会修改原对象( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `unstack` 会返回一个重塑后的新对象(通常是 DataFrame),不修改原始的 Series。

10. 使用merge函数进行列-列连接时,传递的DataFrame索引对象会被丢弃。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 当 `merge` 基于列进行连接时,默认情况下,结果会生成一个新的从 0 开始的整数索引,原始的行索引会被丢弃。

11. 在使用pandas.melt的时候,需要指明作为分组目标的列( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `pd.melt` 需要指明的是作为标识符变量的列(通过 `id_vars` 参数),而不是分组目标。未在 `id_vars` 中指定的列会被“融合”到 `variable` 和 `value` 两列中。

12. combine_first可用于拼接重复数据,用一个对象中的值填充另一个对象中的缺失值( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是对 `combine_first` 功能的准确描述。它会用调用对象(第二个对象)的值来“修补”或“填充”第一个对象中的 `NaN` 值。

13. 在数据透视表中,加入margins=False,可以在下方显示一些总和数据。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 要显示总计(小计),需要设置 `margins=True`。`margins=False` 是默认行为,不显示总计。

14. 以列表(或者数组)作为Series的索引可以构造分层索引。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 要构造分层索引,需要传入一个由元组组成的列表,或者使用 `pd.MultiIndex.from_...` 方法。直接传入一个列表(如 `['a', 'b']`)只会创建单层索引。

15. 在分级索引中,可以通过level选项并通过改变轴向来进行聚合。 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 像 `.sum()`, `.mean()` 等聚合方法都接受 `level` 参数来指定在哪个索引层级上进行聚合,也接受 `axis` 参数来指定是在行索引还是列索引上操作。

16. unstack操作的只能是最内层,stack也是如此 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `unstack` 和 `stack` 默认操作最内层,但都可以接受一个 `level` 参数(层级名称或编号)来指定操作任意一个层级。

17. 默认情况下,merge函数会联合左连接和右连接的效果。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `merge` 默认是内连接 (`inner`)。联合左连接和右连接效果的是外连接 (`outer`)

18. 使用merge函数进行列-列连接时,传递的DataFrame索引对象会被丢弃。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 此题与第 10 题相同,叙述正确。

19. 通过给出层级排序函数sort_index函数中的level选项,可以指明对这一个层级的索引排序( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `sort_index` 的 `level` 参数专门用于在多重索引中指定按哪个层级进行排序。

20. concat函数对两个含有重叠索引的Series进行连接后,重叠索引对应的值为连接前两个重叠索引对应的值之和( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `concat` 只是简单地将 Series 拼接在一起。如果存在重叠的索引,结果中会保留这些重复的索引及其各自对应的值,而不会进行任何算术运算。

21. DataFrame的join方法进行连接键上的左连接,完全保留左边DataFrame的行索引( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `.join()` 方法默认 `how='left'`,即左连接,它会以调用该方法的 DataFrame(左边)的索引为基准进行连接。

22. 若一个具有二重行列索引的数据,使用data.loc(axis=0)[0,1]命令,获得的数据保留二重索引。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `data.loc(axis=0)[0,1]` 是错误的语法。`.loc` 不是一个函数,不能用 `()` 调用。正确的语法是 `data.loc[...]`。

23. DataFrame的多对多连接是行的笛卡尔积( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 在 `merge` 操作中,如果左表的连接键有 M 个匹配项,右表的连接键有 N 个匹配项,那么多对多连接会产生 M * N 行的笛卡尔积。

24. groupby()后,使用agg()可以…但不能对不同的列使用不同的函数( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `.agg()` 的一个核心功能就是可以通过传入一个字典,来对不同的列应用不同的聚合函数。例如 `df.groupby('key').agg({'col_A': 'sum', 'col_B': 'mean'})`。

25. 对两个Series数组调用concat方法,…如果设定axis=1,会生成一个DataFrame ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `axis=0` (默认) 会将两个 Series 垂直拼接成一个更长的 Series。`axis=1` 会将两个 Series 水平并列,每个 Series 成为一列,从而构成一个 DataFrame。

26. DataFrame的set_index函数会生成一个新的DataFrame。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `set_index` 默认 `inplace=False`,返回一个设置了新索引的新 DataFrame 对象。

27. stack(堆叠)会将行中的数据透视到列中( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `stack` (堆叠) 是将中的数据“堆叠”到上,形成一个更长的、带有更多层级索引的 Series。将行透视到列的操作是 `unstack`。

28. swaplevel接收两个层级序号或层级名称,返回一个进行了层级变更的新对象(但是原数据是不变的)( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是对 `swaplevel` 功能的准确描述。

29. concat函数中,join默认的连接方式是'inner'( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `concat` 的 `join` 参数默认为 `'outer'`,即取所有轴上索引的并集。

30. concat函数中,如果传入了keys和/或levels参数,则该参数不能用于多层索引的层级名称( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `keys` 参数用于提供新创建的层级的标签,而 `names` 参数(不是`levels`)用于为这些层级命名。`levels` 是 MultiIndex 的一个属性。这个表述混淆了参数,是错误的。

31. 在concat方法中传入参数ignore_index参数将忽略轴向索引 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `ignore_index=True` 会使 `concat` 忽略原始对象的索引,并生成一个新的从 0 开始的整数索引。

32. merge函数中on参数所需要连接的列名并不必须在两边的DataFrame对象中都出现。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `on` 参数指定的是在两个 DataFrame 中都共同存在的列名。如果两边的列名不同,需要分别使用 `left_on` 和 `right_on`。

33. …frame.reset_index(1)frame.sort_index(level=1)返回的结果相同。 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `reset_index(1)` 会将第 1 层索引(key2)变成一个数据列。`sort_index(level=1)` 会根据第 1 层索引的值对行进行排序。两者功能和返回结果的结构完全不同。

34. sort_index只能在单一层级上对数据进行排序 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `sort_index` 的 `level` 参数可以接受一个列表,从而按多个层级的先后顺序进行排序。

第九章:数据可视化

1. fig.add_subplot(2, 3, 5),第3个参数的含义是在创建的6个子图中,它是第五个( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `add_subplot(nrows, ncols, index)` 中的 `index` 参数是从 1 开始计数的,表示子图在网格中的位置。对于 2x3 的网格,`index=5` 指的是第二行第二列的子图,也就是第5个。

2. DataFrame的plot方法可以在同一个子图中将每一列绘制为不同的折线,并自动生成图例( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是 `df.plot()` 的标准行为。它会为 DataFrame 的每一列(通常是数值列)绘制一条折线,并使用列名作为标签自动生成图例。

3. matplotlibseaborn都是可以用于绘图的包。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** Matplotlib 是基础绘图库,Seaborn 是基于 Matplotlib 的高级封装,两者都是 Python 中主流的数据可视化库。

4. 在图表中添加图形时,需要生成patch对象shp,再调用add_patch(shp)将它加入到子图( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `Patch` 是 Matplotlib 中几何形状的基类。添加形状的标准流程就是先创建 Patch 对象(如 `plt.Rectangle`, `plt.Circle`),然后使用 Axes 对象的 `.add_patch()` 方法将其添加到子图中。

5. fig.add_subplot返回的是Axes Subplot对象( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `fig.add_subplot()` 和 `plt.subplots()` 返回的子图对象都是 `matplotlib.axes.Axes` 的实例(或其子类),通常称为 Axes 对象或子图对象。

6. matplotlib并不检查标签是否重叠( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** Matplotlib 的默认布局算法通常不会主动检查和避免坐标轴刻度、标题等文本标签的重叠,有时需要用户手动调用 `plt.tight_layout()` 或调整图形参数来解决。

7. regplotseaborn中的绘制折线图的方法( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `regplot` 用于绘制散点图并拟合一条线性回归线。Seaborn 中绘制折线图的主要函数是 `lineplot`。

8. 对于折线图,后续的点默认是线性内插( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** Matplotlib 的 `plot` 函数在绘制折线图时,会用直线连接相邻的数据点,这在视觉上是一种线性插值的效果。

9. 运行代码fig.add_subplot(2,2,0)生成的是2×2图片中的第一个子图( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `add_subplot(nrows, ncols, index)` 中的 `index` 参数是从 1 开始计数的,`index=0` 是无效的,会引发 `ValueError`。

10. 使用分面网格是利用多种分组变量对数据进行可视化的方式( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 分面网格(Facet Grid),如 Seaborn 中的 `catplot` 或 `relplot`,核心思想就是根据一个或多个分类变量的值将数据划分到不同的子图中,从而在多个维度上进行比较和可视化。

11. 绘制图表时可以通过传递label参数添加图例来区分不同的绘图元素 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 在 `plt.plot` 等绘图函数中设置 `label` 参数,然后调用 `plt.legend()`,即可显示图例。

12. DataFrame对象调用plot方法时,可以通过传递subplots=True来使得对象的每一列绘制在独立的子图中( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是 `subplots=True` 参数的正确功能描述。

13. plt.plot([2,3, 6, 7,8], 'g--o')plt.plot([2,3, 6, 7,8], 'go--')生成的图形不一样。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 在 Matplotlib 的格式字符串中,颜色、标记和线型的顺序是任意的。`'g--o'` 和 `'go--'` 都表示:颜色绿色(`g`),线型虚线(`--`),标记圆点(`o`)。两者生成的图形是完全一样的。

14. pandas对象的plot.barh方法绘制的是垂直的柱状图( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `barh` 中的 `h` 代表 horizontal(水平)。`.plot.barh()` 绘制的是水平柱状图。`.plot.bar()` 才是绘制垂直柱状图。

15. matplotlib在设置x轴刻度的时候,区间长度必须一致。 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** Matplotlib 的刻度设置非常灵活,完全可以设置不均匀的刻度位置。例如 `plt.xticks([0, 1, 5, 10])`。

16. matplotlib绘制的图位于Figure对象中,可以使用plt.figure()调用 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `Figure` 是 Matplotlib 中最高层级的容器,包含了所有的绘图元素。`plt.figure()` 用于创建一个新的 `Figure` 对象,或者获取当前活动的 `Figure` 对象。

17. 通过使用shareXshareY可以使得子图分别拥有相同的x轴和y轴 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 在 `plt.subplots()` 函数中,设置 `sharex=True` 和 `sharey=True` 可以让所有子图共享相同的 x 轴和 y 轴范围及刻度,这对于比较不同子图非常有用。

18. set_xticks在数据范围内设定刻度的位置,而不设置刻度的标签。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `ax.set_xticks()` 用于设置 x 轴主刻度线的位置。要设置这些位置对应的标签文本,需要使用 `ax.set_xticklabels()`。

19. plt.savefig函数可以将图片保存到文件中,并且只能以svg格式存储( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `savefig` 支持多种文件格式,如 `.png`, `.jpg`, `.pdf`, `.svg` 等,通常根据你提供的文件扩展名自动推断格式。

20. 在绘制直方图的参数中,bins的默认参数是10。 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 在 `plt.hist()` 和 Pandas 的 `.plot.hist()` 中,如果不指定 `bins` 参数,默认会将数据划分到 10 个箱子中。

21. 假设有一个figure对象fig,则fig.add_subplot(224)fig.add_subplot(2,2,4)执行的结果相同。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `add_subplot` 支持一种三位数的简写形式,其中百位是行数,十位是列数,个位是索引。因此 `add_subplot(224)` 等价于 `add_subplot(2, 2, 4)`。

22. 默认情况下,Series和DataFrame的plot()方法绘制的是条形图( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 默认绘制的是线图 (line plot)

23. fig=plt.figure()随后fig.plot()没有问题。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `Figure` 对象本身没有 `.plot()` 方法。绘图是在 `Axes` (子图) 对象上进行的。正确的做法是先用 `fig.add_subplot()` 创建一个子图 `ax`,然后调用 `ax.plot()`。

24. plot函数中’b’代表黑色 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `'b'` 代表蓝色 (blue),`'k'` 代表黑色 (black)。

25. 代码plt.xlim([0, 10])的目的是将x轴的范围设置为0到10。 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是 `plt.xlim()` 函数的标准用法,也可以用 `plt.xlim(0, 10)`。

26. 使用value_counts:s.value_counts().plot.bar()可以有效地对Series值进行可视化。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `s.value_counts()` 会计算 Series 中每个唯一值的出现频率,返回一个新的 Series。对其调用 `.plot.bar()` 可以非常直观地将这些频率以柱状图的形式展示出来。

27. plt.subplots方法可以创建一个新的Figure,并返回一个含有已创建的subplot对象的NumPy数组。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `fig, axes = plt.subplots(...)` 返回一个 Figure 对象 `fig` 和一个包含所有子图 (Axes) 对象的 NumPy 数组 `axes`(如果只创建一个子图,则返回单个 Axes 对象)。

28. matplotlib会自动检查标签是否重叠( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 此题与第 6 题类似,Matplotlib 默认不会检查标签重叠。

29. ax.scatter(np.arange(10), np.arange(10))可以绘制一个x和y取值都在1-10之间的散点图。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `np.arange(10)` 生成的是从 0 到 9 的整数序列,而不是 1 到 10。

30. DataFrame直接进行绘图时,默认把columns当成x轴( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 默认情况下,`df.plot()` 使用 DataFrame 的索引 (index) 作为 x 轴,每一列 (columns) 作为一条独立的 y 轴序列。

第十章:高级数据分析技术

1. 调用groupby方法生成一个GroupBy对象可以直接进行输出。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** GroupBy 对象本身是一个中间对象,它包含了分组信息但没有进行任何计算。直接打印它只会显示其类型信息,如 ``,而不会显示分组后的数据。

2. quantile(分位数)是Series的方法所以也可以用来聚合。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 任何能从数组中产生标量值的函数都可以作为聚合函数。`quantile()` 是 Series 的一个有效方法,可以计算分位数(一个标量),因此可以用于 GroupBy 对象的聚合,例如 `grouped.quantile(0.5)`。

3. 在没有特定指明对DataFrame对象的哪一列进行计算时,默认情况下会对所 有的数值列进行聚合( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 当对一个 GroupBy 对象调用聚合方法(如 `.mean()`, `.sum()`)时,如果未选择特定列,该方法会自动应用到所有可进行该运算的列上,通常是数值类型的列。

4. 聚合数据必须返回行索引,并且自己创建的聚合函数是可以直接使用的( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 聚合后的数据,其索引是分组键,不一定是行索引。自定义的聚合函数可以通过 `.agg()` 或 `.apply()` 方法使用。

5. 使用groupby方法分组时分组键可以是多种形式的,而且键的类型也不一定完全相同( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** GroupBy 的分组键 `by` 参数非常灵活,可以接受列名、Series、数组、函数等,它们的类型也可以不同。

6. 分层索引的数据集可以在某个指定的层级上进行聚合( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** GroupBy 的 `by` 参数和聚合方法(如 `.sum()`)的 `level` 参数都可以用来指定在哪个索引层级上进行分组和聚合。

7. 若传入一组函数或函数名,得到的DataFrame的列就会以相应的函数命名( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 当向 `.agg()` 传入一个函数列表时,例如 `grouped.agg(['mean', 'std'])`,结果 DataFrame 的列名会自动以函数名(如 'mean', 'std')作为新的层级。

8. 聚合只是分组运算中的一种…它只是接受能够将一维数组简化为标量值的函数。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是对聚合 (aggregation) 的准确定义。它是一种将一组值(如一个分组内的数据)转换为一个单一标量值(如均值、和、最大值等)的数据转换过程。

9. 对多个分组键的GroupBy对象进行迭代,生成的元组序列中的第一个元素是键值的元组( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 当按多个键(如 `df.groupby(['key1', 'key2'])`)分组并迭代时,每次迭代返回 `(group_name, sub_df)`。其中 `group_name` 是一个包含该组所有键值的元组,例如 `('a', 'one')`。

10. Crosstab的前两个参数可以是数组、Series、或者数组的列表( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `pd.crosstab` 的 `index` 和 `columns` 参数非常灵活,可以接受 Series、数组或列表,或者这些类型的列表(用于创建多级交叉表)。

11. 对于groupby中的size方法,分组键中的任何缺失值都会被排除在结果之外( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 默认情况下,`groupby` 会忽略分组键中的 `NaN` 值。`.size()` 会计算每个有效分组的大小,但它本身不处理分组键的缺失。

12. apply方法是将对象拆分为多块,在每一块都会调用传递的函数( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是对 GroupBy 的 "Split-Apply-Combine" 模式中 "Apply" 步骤的准确描述。`apply` 方法会对每个分组(块)执行传入的函数。

13. 使用字典构造传给groupby的数组时,字典的键必须与对象的长度一致( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 当使用字典进行分组时,字典的键应该与被分组轴的索引标签相对应,而不是与对象的长度一致。

14. 默认情况下,groupbyaxis = 1的轴向上分组( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `groupby` 的 `axis` 参数默认为 `0`,即默认按行进行分组。

15. 分组键中有缺失值会导致程序报错 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `groupby` 默认会忽略分组键中的 `NaN` 值,不会报错。

16. 分组信息不能以非数组形式存在 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 分组信息(分组键)可以是多种形式,如函数、字典、Series,不限于数组。

17. 在没有特定指明对DataFrame对象的哪一列进行计算时,agg方法默认情况下会对所有的数值列进行聚合( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 此题与第 3 题类似,叙述正确。

18. …执行df.groupby(['key1','key2'])['data2'].mean()可以获得data2列的均值并以DataFrame的形式返回结果( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `df.groupby(...)['data2']` 选择了一列,这是一个 GroupBy Series 对象。对其调用 `.mean()` 会返回一个Series,其索引是分组键 `('key1', 'key2')`。

19. 若df是一个DataFrame对象,则默认情况下,df中的所有的数值列都可以聚合。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 此题与第 3 题和第 17 题类似,叙述正确。

20. 假设有DataFrame对象dfkey1df中的列,则df.groupby('key1').mean()等价于df.groupby(['key1']).mean()。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 按单列分组时,传入字符串 `'key1'` 和包含单个字符串的列表 `['key1']` 是等价的。

21. 使用自定义的聚合函数时需要将其传递给agg方法 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `.agg()` 是应用一个或多个聚合函数(包括自定义函数)到分组上的标准方法。

22. 使用含有原数据不存在的分组键的字典或Series进行分组会出现报错 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 不会报错。如果分组字典或 Series 的键在被分组对象的索引中找不到,这些键值对会被忽略。

23. groupby的参数只可以是列名,不可以是index名。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 可以通过 `level` 参数按索引的层级名称或编号进行分组。

24. cumsum函数不会对df的索引进行排序。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `cumsum()` 在计算累积和时,是按照数据现有的顺序进行的,不会改变或排序索引。

25. 对从DataFrame创建的GroupBy对象用列表或数组进行索引时,返回的是分组的DataFrame( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 当对一个 GroupBy 对象使用 `[]` 选择一列或多列时(如 `grouped[['col_A', 'col_B']]`),它会返回一个新的、只包含这些选定列的 GroupBy 对象,可以继续进行聚合等操作。

26. 返回的聚合数据…取消这种模式,在调用groupby的时候设定as_index=True即可。 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `as_index=True` 是默认行为,它会使分组键成为结果的索引。要取消这种模式(即让分组键保留为数据列),需要设置 `as_index=False`

27. cut返回的Categorical对象不能直接传递给groupby ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `pd.cut()` 返回的 Categorical 对象是进行分箱分析时 `groupby` 的理想分组键。

28. pandas提供了crosstab()函数…返回新的DataFrame对象。 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是对 `pd.crosstab` 功能的准确描述。

29. apply函数只可以传入函数 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 与 `.agg()` 或 `.transform()` 不同,`.apply()` 不接受像 `'mean'` 这样的字符串快捷方式,它必须接受一个可调用的函数对象。

30. 在用groupby方法对DataFrame对象进行分组处理时,…可以是字符串类型的列名、其他python对象…以及python的函数。 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 此题与第 5 题类似,准确描述了 `groupby` 分组键的灵活性。

31. Goupby 对象会生成包含组名和数据块的二位元组序列 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 迭代一个 GroupBy 对象时,每次会产生一个 `(group_name, sub_dataframe)` 形式的二元元组。

32. 由于quantile并不是显式的为GroupBy对象实现的,因此不能用于聚合 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 此题与第 2 题类似。虽然 `.quantile()` 不是像 `.mean()` 那样直接的 GroupBy 方法,但它可以作为有效的聚合函数通过 `.agg()` 或 `.apply()` 来使用。

第十一章:时间序列数据的处理和分析

1. datetime.strptime可以在已知格式的情况下转换日期。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `datetime.strptime(string, format)` 的核心功能就是将一个字符串按照指定的格式解析为 `datetime` 对象。

2. 不能创建含有重复索引的时间序列( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** Pandas 的时间序列(以及其他任何 Series/DataFrame)的索引都可以包含重复的标签。

3. Timestampdatetime都是时间类型,但是timestamp只使用datetime一半的存储空间。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** Pandas 的 `Timestamp` 对象内部使用一个 64 位整数(8字节)来存储纳秒级精度的时间。Python 的 `datetime` 对象通常也占用相似或更多的空间。说 `Timestamp` 只使用一半空间是不准确的。

4. 如果时间序列是含有重复索引的,进行索引得到的结果是切片( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 当使用一个在索引中重复出现的标签进行索引时,Pandas 会返回一个包含所有匹配该标签的行的新 Series 或 DataFrame,这在概念上是一个“切片”或子集。

5. 不同索引的时间序列之间的算术运算在日期上自动对齐( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是 Pandas 的核心特性之一。在进行算术运算时,Pandas 会自动按索引对齐数据,对于只存在于一方的索引,结果会是 `NaN`。

6. pd.date_range('2000-01-01','2000-01-03 23:59',freq='0.545H')是不能运行的。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `freq` 参数可以接受小数,表示非整数倍的频率。`'0.545H'` 是一个有效的频率字符串,表示 0.545 个小时。代码可以正常运行。

7. 以时间戳作为索引的Series可以传递能解释为日期的字符串进行索引。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是 Pandas 时间序列索引的便利之处。你可以使用 `'2011-01-10'`、`'1/10/2011'` 等字符串来索引一个 `DatetimeIndex`,Pandas 会自动解析它们。

8. resample后使用ohlc聚合函数可以获得包含开端-峰值-谷值-结束四种聚合值列的DataFrame( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `ohlc` (Open-High-Low-Close) 是一种专门为金融时间序列设计的聚合函数,它会在每个重采样周期内计算开盘价(第一个值)、最高价、最低价和收盘价(最后一个值)。

9. 在date_rangefreq参数传入“1h10min”是无效的( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** Pandas 的频率字符串支持组合。`'1h10min'` 是一个有效的频率,表示 1 小时 10 分钟。

10. 如果两个时间区间拥有相同的频率,则它们的差是它们之间的单位数。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 对两个相同频率的 `Period` 对象进行减法运算,会得到它们之间相差的频率单位数量。例如 `pd.Period('2011-03', 'M') - pd.Period('2011-01', 'M')` 的结果是 `2`。

11. 时间序列进行索引和选择时,传入的日期字符串格式必须与时间序列中的格式相同( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 此题与第 7 题类似。Pandas 的日期解析器非常灵活,不需要传入的字符串格式与 `DatetimeIndex` 的内部格式完全一致。

12. 所有使用datetime对象的地方都可以使用Timestamp( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** Pandas 的 `Timestamp` 对象是 Python 内置 `datetime` 对象的兼容替代品,并提供了更高的时间精度(纳秒)和一些额外功能。在大多数情况下,它们可以互换使用。

13. 两个时区不同的时间序列联合的结果是UTC时间( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 当合并或操作两个具有不同时区的时间序列时,Pandas 会将它们都转换为协调世界时 (UTC) 以进行统一处理,结果的时区也会是 UTC。

14. 锚定偏置量构成的时间频率是均匀间隔的。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 锚定偏移量(如 `'M'` 月末,`'W-FRI'` 每周五)的间隔是不均匀的,因为每个月的天数不同,每周五之间的间隔也是固定的7天但日期会变。均匀间隔的频率是像 `'D'` (每日) 或 `'H'` (每小时) 这样的。

15. shift函数可以推移时间戳,但不能推移数据。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `shift` 函数有两种用法:
  • `ts.shift(periods)`:移动数据,索引不变。
  • `ts.shift(periods, freq)`:移动索引,数据不变。
因此,它既可以推移数据也可以推移时间戳。

16. 当获得包含时间信息的时间戳时…可以将normalize设置为True。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `pd.to_datetime()` 的 `normalize=True` 参数或 `DatetimeIndex` 的 `.normalize()` 方法可以将时间戳的时间部分“抹掉”,设置为午夜 `00:00:00`。

17. 不可以使用不包含在时间序列中的时间戳进行切片。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 时间序列的切片非常灵活。例如 `ts['2011-01-06':'2011-01-09']` 是完全有效的,即使 `'2011-01-06'` 和 `'2011-01-09'` 这两个日期本身并不在索引中,Pandas 也会返回这个日期范围内的所有数据。

18. 将高频率的数据聚合到低频率成为向上采样,将低频率数据转换到高频率数据称为向下采样。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 描述正好相反。
  • 向下采样 (Downsampling):将高频率数据聚合到低频率(例如,将每日数据聚合为每月数据)。
  • 向上采样 (Upsampling):将低频率数据转换到高频率(例如,将每月数据扩展为每日数据),这通常会引入缺失值。

19. 进行重新采样时,将W-WED转换到W-FRI属于向下采样( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `W-WED` (每周三) 和 `W-FRI` (每周五) 都是周度频率,它们的频率是相同的。这不属于向上或向下采样,只是一种频率的转换。

20. 运行代码pd.to_datetime(['2000-1-1','31-12-2000','8-31-2000'])会报错( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `pd.to_datetime()` 的解析器非常强大,能够处理多种混合的日期格式。它能正确解析 `'31-12-2000'` (日-月-年) 和 `'8-31-2000'` (月-日-年),不会报错。

21. 当把datetime类型的数据作为索引时,数据类型变为DatetimeIndex。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 当使用 `datetime` 对象列表或类似序列作为 Series/DataFrame 的索引时,Pandas 会自动将其转换为 `DatetimeIndex` 类型。

22. timedelta可以查看daysseconds而不能查看minutes。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `timedelta` 对象内部只存储 `days`, `seconds`, `microseconds`。虽然没有直接的 `.minutes` 属性,但可以通过总秒数 `.total_seconds() / 60` 来计算分钟。

23. resample函数得loffset参数可以用shift实现( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `loffset` (label offset) 用于对聚合后的标签进行调整,其效果与对结果调用 `.shift()` 方法类似。

24. 向上采样中,目标频率是原频率得子区间( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 向上采样(如从月度到每日)意味着新的、更高频率的时间点是原始低频率区间的子集或细分。

25. date_range()函数生产日期时间数据时,如果以6天为间隔可以设置参数freq‘6D’。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** Pandas 频率字符串支持在基础频率前加一个整数倍数,`'6D'` 是表示“6天”的正确写法。

26. ...datetime.strptime(value, '%Y/%m/%d')都可以正确运行 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `strptime` 要求字符串 `value` 的格式必须与提供的 `format` 参数严格匹配。`'2011-01-03'` 与 `'%Y/%m/%d'` 的分隔符不匹配,会引发 `ValueError`。

27. datetime的格式%Y显示的是四位的年份( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `%Y` 代表四位数的年份(如 2019),`%y` 代表两位数的年份(如 19)。

28. resample 的方法参数中,convention的默认值为‘start’( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 在对 `Period` 数据进行重采样时,`convention` 参数用于决定将低频区间转换为高频区间时,是取区间的开始 (`'start'`) 还是结束 (`'end'`)。其默认值为 `'start'`。

29. pandas的通用时间序列是不规则的,即时间序列的频率不是固定的 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** Pandas 的时间序列可以是不规则的,即时间戳之间没有固定的时间间隔。`resample` 等工具就是用来处理这种不规则序列并将其转换为规则频率的。

第十二章:一些Pandas中的高级用法

1. 一个分类数组可以包含任一不可变的值类型( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 分类数据 (Categorical) 的类别 (`categories`) 可以是任何不可变类型,如字符串、整数、元组等。

2. 分类数据一定是字符串。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 如上一题所述,分类数据的类别可以是任何不可变类型,不限于字符串。

3. 将特定的大型数据集进行分析时,将数据转换为分类数据会大幅提高性能( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 当一个列包含大量重复的字符串或其他对象时,将其转换为 `category` 类型会用整数编码替代原始值,从而大大减少内存占用,并能显著提升某些分析操作(如 `groupby`)的性能。

4. 对于Series中的分类方法,rename_categoriesset_categories…但前者不能改变类别的数量,而后者可以添加或删除类别( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是对这两个方法区别的准确描述。`rename_categories` 只是重命名现有的类别,数量不变。`set_categories` 则是用一个全新的列表来替换类别,可以增删类别。

5. 对一个Categorical进行set_categories操作,赋值给一个新的对象,不会影响到新对象的类别。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `set_categories` 的作用就是改变或设置类别。将操作结果赋值给新对象,新对象的类别就是被设置成的新类别。

6. pipe方法的一个潜在用途是将操作的序列泛化成可复用的函数( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `.pipe()` 方法允许将一个对象(如 DataFrame)作为第一个参数传递给一个函数,从而实现链式调用。这使得将一系列数据处理步骤封装成可复用的函数变得非常方便。

7. pandas.qcut生成的结果的数据类型是pandas.Categorical( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `pd.qcut` 和 `pd.cut` 都用于数据分箱,它们返回的结果是一个 `Categorical` 对象。

8. df2=df.copy(),df2['k']=vdf2=df.assign(k=v)是等价的( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 两者都实现了创建 `df` 的一个副本并添加或修改名为 `'k'` 的列。`.assign()` 方法专门为此设计,并返回一个新对象,而第一种方法是先显式复制再修改。在效果上是等价的。

9. ...pd.unique(values)返回的结果是FALSE ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `pd.unique()` 会返回输入序列中的唯一值,并保持其出现的原始顺序。对于 `values`,结果会是一个包含 `['apple', 'orange']` 的 NumPy 数组。

10. transform可以产生一个标量值,并广播到各分组的尺寸数据中。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是对 `transform` 核心功能的准确描述。例如,`grouped.transform('mean')` 会计算每个分组的均值(一个标量),然后将这个标量值“广播”回该分组的所有原始位置。

11. Categorical对象的codes属性对应的dtypefloat64( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `.codes` 属性是一个 NumPy 数组,其元素是表示类别的整数编码,数据类型通常是 `int8` 或 `int16` 等整数类型,不是 `float64`。

12. transform函数不可以改变它的输入( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `transform` 传入的函数必须返回一个与输入分组形状相同的对象,它用于“转换”数据,而不是像 `agg` 那样改变其形状(聚合)。

13. 分类转换会自动指定类别的顺序。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 当从序列创建 Categorical 对象时,如果没有明确指定类别,Pandas 会自动从数据中找出唯一值,并按字母或数值顺序排列它们作为类别。

14. Categorical对象比Series使用更少的内存,在对象上进行操作也更快。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 当数据包含大量重复值时,Categorical 对象通过整数编码来存储数据,可以显著减少内存占用,并提高某些操作(如 `groupby`)的性能。

15. resample是一种基于时间分段的分组操作。 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `.resample()` 的核心功能就是根据指定的时间频率将时间序列数据划分到不同的时间“箱子”(分段)中,其行为类似于一个专门针对时间序列的 `groupby`。

16. 使用TimeGrouper时,时间必须是Series或者DataFrame索引 ( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `TimeGrouper`(现在推荐使用 `pd.Grouper`)是 `groupby` 的一个特殊工具,它要求分组的轴必须是一个 `DatetimeIndex`。

17. DataFrame.assign方法可以按指定修改原DataFrame( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `.assign()` 方法总是返回一个新的 DataFrame 副本,其中包含了新增或修改的列,而不修改原始的 DataFrame。

18. ...cat_s.remove_unused_categories()可以去除所有没有出现在数据中的类别( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 这是 `.remove_unused_categories()` 方法的正确功能描述。

19. fruits_cat = df['fruit'].astype('category')得到的fruits_cat是一个Numpy数组。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `df['fruit'].astype('category')` 返回的是一个数据类型为 `category` 的 Pandas Series 对象,而不是 NumPy 数组。

20. 通过pandas.qcut分箱函数生成的Categories对象的类别已经指定了顺序( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `qcut` 和 `cut` 生成的 `Categorical` 对象都是有序的(ordered),因为区间本身具有大小顺序。

21. take函数得到的Series的索引是values的值。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `s.take(indices)` 会根据 `indices` 中的位置来从 `s` 中取值,但返回的新 Series 的索引是 `indices` 本身的索引(如果 `indices` 是一个 Series)或者是一个新的整数索引。

22. category的字符串类别输出时不带单引号。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 当打印一个分类类型的 Series 或 Categorical 对象时,其值(如果是字符串)通常不带引号,这是 Pandas 的一种显示优化。

23. pandas的TimeGrouper可以使用Grouper替代( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** `pd.TimeGrouper` 在较新版本的 Pandas 中已被弃用,官方推荐使用 `pd.Grouper`,例如 `df.groupby(pd.Grouper(key='time', freq='5min'))`。

24. remove_categories将移除类别所对应的值。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `.remove_categories()` 会移除指定的类别。如果被移除的类别在数据中存在,那么这些数据值会变成 `NaN`,而不是整个值(行)被移除。

25. Categorical对象比Series使用更少的内存,在对象上进行操作也明显更快。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 此题与第 14 题相同,叙述正确。

26. g.transform('len') 可以运行。( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** `transform` 期望传入的函数能对每个分组(Series)进行计算并返回一个与输入形状相同的 Series。`len()` 函数作用于一个 Series 会返回一个标量(长度),而不是一个 Series。因此,`g.transform('len')`(或 `g.transform(len)`)会报错。能接受 `len` 的是 `.agg()` 或 `.apply()`。

27. 对一个Categorical进行set_categories操作,赋值给一个新的对象,会影响到新对象的类别。( )

点击查看解析
**正确答案:** 正确 (True)

**解析:** 此题与第 5 题的叙述相反。`set_categories` 的作用就是改变或设置类别,所以新对象的类别当然会是新设置的类别。

28. df['fruit'].astype('category')返回的是Numpy数组 ( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 此题与第 19 题相同,返回的是一个 Pandas Series

29. Categories对象的categories属性…codes属性…( )

点击查看解析
**正确答案:** 错误 (False)

**解析:** 描述正好相反。
  • `.categories`:是维度表,包含唯一的类别
  • `.codes`:是引用维度表的整数数组
文章作者: Enoch
文章链接: https://cccignore.github.io/2025/06/20/Python%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%88%A4%E6%96%AD%E9%A2%98%E6%95%B4%E7%90%86/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Welcome to Enoch's Blog!

评论