2891. 方法链
2891. 方法链
题目
DataFrame animals
+-------------+--------+ | Column Name | Type | +-------------+--------+ | name | object | | species | object | | age | int | | weight | int | +-------------+--------+
Write a solution to list the names of animals that weigh strictly more than 100
kilograms.
Return the animals sorted by weight in descending order.
The result format is in the following example.
Example 1:
Input:
DataFrame animals:
+----------+---------+-----+--------+ | name | species | age | weight | +----------+---------+-----+--------+ | Tatiana | Snake | 98 | 464 | | Khaled | Giraffe | 50 | 41 | | Alex | Leopard | 6 | 328 | | Jonathan | Monkey | 45 | 463 | | Stefan | Bear | 100 | 50 | | Tommy | Panda | 26 | 349 | +----------+---------+-----+--------+
Output:
+----------+ | name | +----------+ | Tatiana | | Jonathan | | Tommy | | Alex | +----------+
Explanation:
All animals weighing more than 100 should be included in the results table.
Tatiana's weight is 464, Jonathan's weight is 463, Tommy's weight is 349, and Alex's weight is 328.
The results should be sorted in descending order of weight.
In Pandas, method chaining enables us to perform operations on a DataFrame without breaking up each operation into a separate line or creating multiple temporary variables.
Can you complete this task in just one line of code using method chaining?
题目大意
DataFrame animals
+-------------+--------+ | Column Name | Type | +-------------+--------+ | name | object | | species | object | | age | int | | weight | int | +-------------+--------+
编写一个解决方案来列出体重 严格超过 100
千克的动物的名称。
按体重 降序 返回动物。
返回结果格式如下示例所示。
示例 1:
输入:
DataFrame animals:
+----------+---------+-----+--------+ | name | species | age | weight | +----------+---------+-----+--------+ | Tatiana | Snake | 98 | 464 | | Khaled | Giraffe | 50 | 41 | | Alex | Leopard | 6 | 328 | | Jonathan | Monkey | 45 | 463 | | Stefan | Bear | 100 | 50 | | Tommy | Panda | 26 | 349 | +----------+---------+-----+--------+
输出:
+----------+ | name | +----------+ | Tatiana | | Jonathan | | Tommy | | Alex | +----------+
解释:
所有体重超过 100 的动物都应包含在结果表中。
Tatiana 的体重为 464,Jonathan 的体重为 463,Tommy 的体重为 349,Alex 的体重为 328。
结果应按体重降序排序。
在 Pandas 中,方法链 允许我们在 DataFrame 上执行操作,而无需将每个操作拆分成单独的行或创建多个临时变量。
你能用 一行 代码的方法链完成这个任务吗?
解题思路
筛选条件:
- 使用
animals['weight'] > 100
筛选出满足体重大于 100 的动物。 - 通过
animals[condition]
返回满足条件的行。
- 使用
排序操作:
- 使用
sort_values(['weight'], ascending=False)
按照体重列weight
进行降序排序。 ascending=False
表示从大到小排序。
- 使用
列选择:
- 使用
[["name"]]
选择需要返回的列,仅保留动物的名字name
。
- 使用
返回结果:
- 返回一个新的 DataFrame,其中包含体重大于 100 的动物名字,按体重降序排列。
复杂度分析
时间复杂度:
O(n log n)
- 筛选操作的复杂度为
O(n)
,其中n
是表的行数。 - 排序操作的复杂度为
O(n log n)
,其中n
是筛选后保留的行数。 - 列选择的复杂度为
O(1)
,因为只操作列索引。 - 综合时间复杂度为
O(n log n)
(排序占主导)。
- 筛选操作的复杂度为
空间复杂度:
O(k)
,其中k
是筛选后的行数,筛选和排序会返回新的 DataFrame。
代码
import pandas as pd
def findHeavyAnimals(animals: pd.DataFrame) -> pd.DataFrame:
return animals[animals['weight'] > 100].sort_values(['weight'], ascending=False)[['name']]