11,Python数分之Pandas训练,力扣,1285. 找到连续区间的开始和结束数字

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

目录

一,原题力扣链接

二,题干

三,建表语句

四,分析

五,SQL解答

六,验证

七,知识点总结


一,原题力扣链接

. - 力扣(LeetCode)

二,题干

表:Logs

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| log_id        | int     |
+---------------+---------+
id 是上表具有唯一值的列。
上表的每一行包含日志表中的一个 ID。

编写解决方案,得到 Logs 表中的连续区间的开始数字和结束数字。

返回结果表按照 start_id 排序。

结果格式如下面的例子。

示例 1:

输入:
Logs 表:
+------------+
| log_id     |
+------------+
| 1          |
| 2          |
| 3          |
| 7          |
| 8          |
| 10         |
+------------+
输出:
+------------+--------------+
| start_id   | end_id       |
+------------+--------------+
| 1          | 3            |
| 7          | 8            |
| 10         | 10           |
+------------+--------------+
解释:
结果表应包含 Logs 表中的所有区间。
从 1 到 3 在表中。
从 4 到 6 不在表中。
从 7 到 8 在表中。
9 不在表中。
10 在表中。

三,建表语句

import pandas as pd
data = [[1], [2], [3], [7], [8], [10]]
logs = pd.DataFrame(data, columns=['log_id']).astype({'log_id':'Int64'})

四,分析

题解:

表1 日志表

字段 登录id

求 连续登录的id 开始数值和结束数字

 第一步,给表排序

df =logs.sort_values('log_id')  #排序

第二步,创建一个新列 生成一个连续的序列

df['rn'] = logs.reset_index().index + 1  #模拟row_number 实现一个rn列
df['rn1']=df['log_id']-df['rn']  # 取差值

第三步,创建一个新的dataframe对象 然后分别创建两个列 取分组后最大值和最小值

五,Pandas解答

import pandas as pd

def find_continuous_ranges(logs: pd.DataFrame) -> pd.DataFrame:
    df =logs.sort_values('log_id')  #排序
    df['rn'] = logs.reset_index().index + 1  #模拟row_number 实现一个rn列
    df['rn1']=df['log_id']-df['rn']  # 取差值
    df2 = pd.DataFrame()  #创建以df对象 
    df2['start_id'] = df.groupby('rn1')['log_id'].min()  #给一列
    df2['end_id'] = df.groupby('rn1')['log_id'].max()  #在给他一列
    return df2

六,验证

七,知识点总结

  • Pandas排序的运用 API:sort_values
  • Pandas创建一个序列模拟 slq中的row_number创建一个rn列 API:reset_index()
  • Pandas创建df对象的运用
  • pandas分组取最大值的运用 API groupby...min
  • pandas分组取最小值的运用 API groupby...max
  • 连续值的问题 想排序 在取序列 在取差值,在用差值分组取对应的需求

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值