9,Python数分之Pandas训练,力扣,1831. 每天的最大交易

  • 学习:知识的初次邂逅
  • 复习:知识的温故知新
  • 练习:知识的实践应用

目录

一,原题力扣链接

二,题干

三,建表语句

四,分析

五,Pandas解答

六,验证

七,知识点总结


一,原题力扣链接

. - 力扣(LeetCode)

二,题干

表: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函数的运用

  • 学习:知识的初次邂逅
  • 复习:知识的温故知新
  • 练习:知识的实践应用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值