27,Python数分之Pandas训练,力扣,612. 平面上的最近距离

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

目录

一,原题力扣链接

二,题干

三,建表语句

四,分析

五,Pandas解答

六,验证

七,知识点总结


一,原题力扣链接

. - 力扣(LeetCode)

二,题干

Point2D 表:

+-------------+------+
| Column Name | Type |
+-------------+------+
| x           | int  |
| y           | int  |
+-------------+------+
(x, y) 是该表的主键列(具有唯一值的列的组合)。
这张表的每一行表示 X-Y 平面上一个点的位置

p1(x1, y1) 和 p2(x2, y2) 这两点之间的距离是 sqrt((x2 - x1)2 + (y2 - y1)2) 。

编写解决方案,报告 Point2D 表中任意两点之间的最短距离。保留 2 位小数 。

返回结果格式如下例所示。

示例 1:

输入:
Point2D table:
+----+----+
| x  | y  |
+----+----+
| -1 | -1 |
| 0  | 0  |
| -1 | -2 |
+----+----+
输出:
+----------+
| shortest |
+----------+
| 1.00     |
+----------+
解释:最短距离是 1.00 ,从点 (-1, -1) 到点 (-1, 2) 。

三,建表语句

import pandas as pd


data = [[-1, -1], [0, 0], [-1, -2]]
point2_d = pd.DataFrame(data, columns=['x', 'y']).astype({'x':'Int64', 'y':'Int64'})
point2_d

 

四,分析

题解: 

表:2d表

字段:x轴坐标,y轴左表

求 两点之间最短的距离

第一步 内连接: pandas中做一个笛卡尔连接 可以巧用辅助列实现

# pandas中实现笛卡尔连接 最妙的办法就是生成一个辅助列 用内连接 然后连接这个辅助列~  最后在删除这个辅助列即可
point2_d['temp']=1
df = pd.merge(point2_d,point2_d, how='inner', on='temp').drop('temp',axis=1)
df 

第二步:pandas中 多列一起条件过滤 也可以用辅助列实现 

比如创建2个辅助列,条件过滤之后,在删除则这个辅助列

df 
#%%
df['temp1'] = df['x_x']+df['y_x']  #条件 辅助列1
df['temp2'] = df['x_y']+df['y_y']  #条件 辅助列2

df = df[df['temp1'] != df['temp2']]  #然后在条件过滤
df = df.drop(['temp1','temp2'],axis=1)
df

第三步:导入numpy包 ,使用np包中的指函数和幂函数进行运算 最后得到全部两点之间的距离

#按公式计算 在最小值取出来 
import numpy as np
df['shortest'] = np.sqrt(  np.power(   (df['x_x']-df['x_y']) , 2) +   np.power(  (df['y_x'] - df['y_y'])   ,2))
df

最后一步。取最小值即可

pandas中是创建了一个新的df对象 然后把最小值赛进去

五,Pandas解答

import pandas as pd

def shortest_distance(point2_d: pd.DataFrame) -> pd.DataFrame:
    # pandas中实现笛卡尔连接 最妙的办法就是生成一个辅助列 用内连接 然后连接这个辅助列~  最后在删除这个辅助列即可
    point2_d['temp']=1
    df = pd.merge(point2_d,point2_d, how='inner', on='temp').drop('temp',axis=1)
    
    #辅助线
    df['temp1'] = df['x_x']+df['y_x']  #条件 辅助列1
    df['temp2'] = df['x_y']+df['y_y']  #条件 辅助列2
    df = df[df['temp1'] != df['temp2']]  #然后在条件过滤
    df = df.drop(['temp1','temp2'],axis=1)
    #按公式计算 在最小值取出来 
    import numpy as np
    df['shortest'] = np.sqrt(  np.power(   (df['x_x']-df['x_y']) , 2) +   np.power(  (df['y_x'] - df['y_y'])   ,2))
    df_res = pd.DataFrame()
    df_res['shortest'] = [round(df['shortest'].min(),2)]
    return df_res
shortest_distance(point2_d)

六,验证

七,知识点总结

  • Pandas中要实现笛卡尔连接 可以妙用辅助列实现
  • Pandas中内连接的运用 API: merge
  • Pandas中删除列的运用  API: drop。。axis=1
  • Pandas中多列条件过滤的运用
  • 妙用辅助列,开两个辅助列 相互拼接在一起 如果他们都不等于即可
  • 最后在删除这个2个辅助内
  • Pandas中引入numpy包中的指函数和幂函数 计算两点之间最短的距离
  • Pandas中创建dataframe对象的运用
  • Pandas中计算最小值的运用 min
  • Pandas中四舍五入的运用 round
  • python函数的运用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值