题目
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 上执行操作,而无需将每个操作拆分成单独的行或创建多个临时变量。
你能用 一行 代码的方法链完成这个任务吗?
思路
- 本题考察的是使用的df的sort_values方法,对属性进行排序。
- 首先先根据bool索引查找体重大于100kg的动物数据,然后对这些数据使用sort_values方法对weight进行降序排列,接着取出名字series,最后再组成DataFrame即可。
代码实现
import pandas as pd
def findHeavyAnimals(animals: pd.DataFrame) -> pd.DataFrame:
return pd.DataFrame((animals[animals["weight"]>100].sort_values(by="weight", ascending=False))["name"])
知识积累
- 对DataFrame的数据排序:df.sort_values(by, axis=0, ascending=True, inplace=False, na_position='last')
- by:指定列名(axis=0或"index")或索引值(axis=1或"columns")
- axis:成组的轴,若axis=0或"index",则行成组,按指定列的数据大小排序;若axis=1或"columns",则列成组,按指定索引中的数据大小排序。
- ascending:排序方式,True为升序,False为降序。
- inplace:是否用排序后的数据替换原数据,如果为True替换完后返回None,如果为False不替换,直接返回排序后的数据。
- na_position:设定缺失值的显示位置,有"first", "last"两种。
官方题解
- 这种一行代码完成多个方法的操作就叫方法链,不过官解里面有一个细节还是有必要学习的,在df上选择列,如果只有一个中括号,返回的是series对象,如果是两个,则是指定多列,返回的是DataFrame对象。
- 复现:
import pandas as pd def findHeavyAnimals(animals: pd.DataFrame) -> pd.DataFrame: return (animals[animals["weight"]>100].sort_values(by="weight", ascending=False))[["name"]]