跳至主要內容

2880. 数据选取


2880. 数据选取

🟢   🔗 力扣open in new window LeetCodeopen in new window

题目

DataFrame students

+-------------+--------+
| Column Name | Type   |
+-------------+--------+
| student_id  | int    |
| name        | object |
| age         | int    |
+-------------+--------+

Write a solution to select the name and age of the student with student_id = 101.

The result format is in the following example.

Example 1:

Input:

+------------+---------+-----+
| student_id | name    | age |
+------------+---------+-----+
| 101        | Ulysses | 13  |
| 53         | William | 10  |
| 128        | Henry   | 6   |
| 3          | Henry   | 11  |
+------------+---------+-----+

Output:

+---------+-----+
| name    | age |
+---------+-----+
| Ulysses | 13  |
+---------+-----+

Explanation: Student Ulysses has student_id = 101, we select the name and age.

题目大意

DataFrame students

+-------------+--------+
| Column Name | Type   |
+-------------+--------+
| student_id  | int    |
| name        | object |
| age         | int    |
+-------------+--------+

编写一个解决方案,选择 student_id = 101 的学生的 name 和 age 并输出。

返回结果格式如下示例所示。

示例 1:

输入:

+------------+---------+-----+
| student_id | name    | age |
+------------+---------+-----+
| 101        | Ulysses | 13  |
| 53         | William | 10  |
| 128        | Henry   | 6   |
| 3          | Henry   | 11  |
+------------+---------+-----+

输出:

+---------+-----+
| name    | age |
+---------+-----+
| Ulysses | 13  |
+---------+-----+

解释: 学生 Ulysses 的 student_id = 101,所以我们输出了他的 name 和 age。

解题思路

有三种方法:

  1. 布尔索引结合列选择

    • students["student_id"] == 101 生成一个布尔条件(True/False)的 Series。
    • students[...] 使用布尔索引,选出 student_id 等于 101 的行。
    • [["name", "age"]] 再从结果中选取指定列。
  2. .loc[] 方法

    • students["student_id"] == 101 同样生成布尔条件。
    • .loc[rows, columns] 允许直接指定行和列,行通过布尔索引筛选,列通过显式列表选择。
  3. .loc[] 方法选取行并扩展列范围

    • students["student_id"] == 101 筛选出 student_id 为 101 的行。
    • "name": 表示从 name 列开始,选择包括其后的所有列。

复杂度分析

  • 时间复杂度O(n),筛选行需遍历每行(students["student_id"] == 101),列选择只需访问指定列(如 [["name", "age"]])。
  • 空间复杂度O(1),返回结果是原数据的视图(若未显式复制),额外空间开销为 O(1)

代码

import pandas as pd

def selectData(students: pd.DataFrame) -> pd.DataFrame:
  return students[students["student_id"] == 101][["name", "age"]]
  #OR
  return students.loc[students["student_id"] == 101, ["name", "age"]]
  #OR
  return students.loc[students["student_id"] == 101, "name" :]