- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用
目录
一,原题力扣链接
二,题干
表:
Transactions
+----------------+----------+ | Column Name | Type | +----------------+----------+ | transaction_id | int | | day | datetime | | amount | int | +----------------+----------+ transaction_id 是该表具有唯一值的列。 每行包括了该次交易的信息。编写一个解决方案,报告每天交易金额
amount
最大 的交易 ID 。如果一天中有多个这样的交易,返回这些交易的 ID 。返回结果根据
transaction_id
升序排列。返回格式如下示例所示:
示例 1:
输入: Transactions table: +----------------+--------------------+--------+ | transaction_id | day | amount | +----------------+--------------------+--------+ | 8 | 2021-4-3 15:57:28 | 57 | | 9 | 2021-4-28 08:47:25 | 21 | | 1 | 2021-4-29 13:28:30 | 58 | | 5 | 2021-4-28 16:39:59 | 40 | | 6 | 2021-4-29 23:39:28 | 58 | +----------------+--------------------+--------+ 输出: +----------------+ | transaction_id | +----------------+ | 1 | | 5 | | 6 | | 8 | +----------------+ 解释: "2021-4-3" --> 有一个 id 是 8 的交易,因此,把它加入结果表。 "2021-4-28" --> 有两个交易,id 是 5 和 9 ,交易 5 的金额是 40 ,而交易 9 的数量是 21 。只需要将交易 5 加入结果表,因为它是当天金额最大的交易。 "2021-4-29" --> 有两个交易,id 是 1 和 6 ,这两个交易的金额都是 58 ,因此需要把它们都写入结果表。 最后,把交易 id 按照升序排列。进阶:你可以不使用
MAX()
函数解决这道题目吗?回答: 本来就没用max() 函数解决这个问题 用开窗排序
三,建表语句
import pandas as pd
data = [[8, '2021-4-3 15:57:28', 57], [9, '2021-4-28 08:47:25', 21], [1, '2021-4-29 13:28:30', 58], [5, '2021-4-28 16:39:59', 40], [6, '2021-4-29 23:39:28', 58]]
transactions = pd.DataFrame(data, columns=['transaction_id', 'day', 'amount']).astype({'transaction_id':'Int64', 'day':'datetime64[ns]', 'amount':'Int64'})
四,分析
题解:
表:交易类型表
字段:交易id,交易日期,交易金额
求:每日最大的交易 允许并列 按照要求排序
第一步:去day的列的年月日
transactions['date_only'] = transactions['day'].astype(str).str.split().str[0] #截取年月日
第二步:开一个排序列 允许并列 所以用rank 以年月日分组 以金额排序
transactions['rn'] = transactions.groupby('date_only')['amount'].rank(method='min',ascending=False) #开一个排序列 rn
transactions
第三步: 过滤rn ==1 的值 以及映射指定的列 并按照要求排序
五,Pandas解答
import pandas as pd
def find_maximum_transaction(transactions: pd.DataFrame) -> pd.DataFrame:
transactions['date_only'] = transactions['day'].astype(str).str.split().str[0]
transactions['rn'] = transactions.groupby('date_only')['amount'].rank(method='min',ascending=False)
df =transactions[transactions['rn'] ==1]
df2 =df.sort_values('transaction_id',ascending=True)
df3 = df2['transaction_id']
df4 =df3.to_frame()
return df4
六,验证
七,知识点总结
- Pandas时间函数的运用 API:把一列转为年-月-日
- Pandas分组排序 允许并列第一的运用 API: groupby ....rank....accening
- Pandas过滤的运用
- Pandas排序的运用 API: sort_values
- python函数的运用
- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用