20,Python数分之Pandas训练,力扣,574. 当选者

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

目录

一,原题力扣链接

二,题干

三,建表语句

四,分析

五,Pandas解答

六,验证

七,知识点总结


一,原题力扣链接

. - 力扣(LeetCode)

二,题干

表: Candidate

+-------------+----------+
| Column Name | Type     |
+-------------+----------+
| id          | int      |
| name        | varchar  |
+-------------+----------+
id 是该表中具有唯一值的列
该表的每一行都包含关于候选对象的id和名称的信息。

表: Vote

+-------------+------+
| Column Name | Type |
+-------------+------+
| id          | int  |
| candidateId | int  |
+-------------+------+
id 是自动递增的主键(具有唯一值的列)。
candidateId是id来自Candidate表的外键(reference 列)。
该表的每一行决定了在选举中获得第i张选票的候选人。

编写解决方案来报告获胜候选人的名字(即获得最多选票的候选人)。

生成的测试用例保证 只有一个候选人赢得 选举。

返回结果格式如下所示。

示例 1:

输入: 
Candidate table:
+----+------+
| id | name |
+----+------+
| 1  | A    |
| 2  | B    |
| 3  | C    |
| 4  | D    |
| 5  | E    |
+----+------+
Vote table:
+----+-------------+
| id | candidateId |
+----+-------------+
| 1  | 2           |
| 2  | 4           |
| 3  | 3           |
| 4  | 2           |
| 5  | 5           |
+----+-------------+
输出: 
+------+
| name |
+------+
| B    |
+------+
解释: 
候选人B有2票。候选人C、D、E各有1票。
获胜者是候选人B。

三,建表语句

import pandas as pd

data = [[1, 'A'], [2, 'B'], [3, 'C'], [4, 'D'], [5, 'E']]
candidate = pd.DataFrame(data, columns=['id', 'name']).astype({'id':'Int64', 'name':'object'})
data = [[1, 2], [2, 4], [3, 3], [4, 2], [5, 5]]
vote = pd.DataFrame(data, columns=['id', 'candidateId']).astype({'id':'Int64', 'candidateId':'Int64'})

candidate

四,分析

题解:

表1:候选人表

字段:候选人id,候选人姓名

表2:候选人投标表

字段。id,候选人id

求投票最多的候选人

第一步: 左连接这个表

#第一步 左连接2个表
df = pd.merge(candidate,vote,how='left',left_on='id',right_on='candidateId')
df

第二步:以name分组 统计次数

 第三步: 取最大值,然后条件过滤 单统计的次数=最大值的时候 取name 

最后把他转为df对象输出即可

五,Pandas解答

import pandas as pd

def winning_candidate(candidate: pd.DataFrame, vote: pd.DataFrame) -> pd.DataFrame:
    #第一步 左连接2个表
    df = pd.merge(candidate,vote,how='left',left_on='id',right_on='candidateId')
    #以name分组 统计次数
    df1 = df.groupby('name').count()
    #开一个新列 取最大值
    df1['mo']=df1['candidateId'].max()
    #条件过滤 过滤之后 添加一个索引
    df1 = df1[df1['candidateId']==df1['mo']].reset_index()
    #映射指定的列
    df2 = df1['name'].to_frame()
    return df2
winning_candidate(candidate,vote)

六,验证

七,知识点总结

  • Pandas中左连接的运用 API: merge
  • Pandas中分组 count的运用 API :groupby....count
  • Pandas中最大值的运用 API: max
  • Pandas中过滤的运用 
  • Pandas中添加一个索引的运用 API:reset_index()
  • Pandas中把series对象变成dataframe的运用 API:to_frame
  • python函数的综合运用
  • 经典题目:众多候选人中得票最多的人 也是一个变相的分组求top1

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值