无效的推文
题目来源:1683. 无效的推文 - 力扣(LeetCode)
题目:
Tweets表:
查询所有无效推文的编号(ID)。当推文内容中的字符数严格大于
15
时,该推文是无效的。以任意顺序返回结果表。
查询结果格式如下所示:
示例:
题解:
使用行过滤的方法,找出content长度大于15行,对于DataFrame可以使用str.len()方法来计算字符串的长度
import pandas as pd
def invalid_tweets(tweets: pd.DataFrame) -> pd.DataFrame:
is_valid = tweets['content'].str.len() > 15
df = tweets[is_valid]
return df[['tweet_id']]
计算特殊奖金
题目来源:1873. 计算特殊奖金 - 力扣(LeetCode)
题目:
Employees表:
计算每个雇员的奖金。如果一个雇员的 id 是 奇数 并且他的名字不是以
'M'
开头,那么他的奖金是他工资的100%
,否则奖金为0
。返回的结果按照
employee_id
排序。返回结果格式如下面的例子所示。
示例:
题解:
参考:1873. 计算特殊奖金 - 力扣(LeetCode)
这里使用if-else进行判断即可
bonus = salary if (id % 1 and not name.startwith('M')) else 0
可以使用循环逐一迭代DataFrame中的每一行
但Python还提供了一种更优雅且更高效的方法,称为"向量化",它使用 apply() 方法。向量化利用 Pandas 中的底层优化,使我们能够一次对整个列或行应用操作,从而实现更快、更简洁的代码。
通过一个自定义的函数来计算奖金,并利用带有axis=1
参数的apply()
,表示按行处理。
employees['bonus'] = employees.apply(
lambda x: x['salary'] if x['employee_id'] % 2 and not x['name'].startswith('M') else 0,
axis=1
)
然后选择指定行,并按照employee_id
升序排列即可
import pandas as pd
def calculate_special_bonus(employees: pd.DataFrame) -> pd.DataFrame:
employees['bonus'] = employees.apply(
lambda x: x['salary'] if x['employee_id'] % 2 and not x['name'].startswith('M') else 0,
axis = 1
)
df = employees[['employee_id', 'bonus']].sort_values('employee_id')
return df
修复表中的名字
题目来源:1667. 修复表中的名字 - 力扣(LeetCode)
题目:
Users表:
修复名字,使得只有第一个字符是大写的,其余都是小写的。
返回按
user_id
排序的结果表。返回结果格式示例如下。
示例:
题解:
参考:1667. 修复表中的名字 - 力扣(LeetCode)
方法一:
使用str中的title()
方法,将第一个字母大写,其余均为小写
import pandas as pd
def fix_names(users: pd.DataFrame) -> pd.DataFrame:
users['name'] = users['name'].str.title()
return users.sort_values('user_id')
方法二:
Pandas的.str 访问器方法本质上是 Series 和 Index 对象的矢量化字符串函数。这意味着我们可以将字符串函数应用于 Series 或 Index 中的每个元素,而不必单独循环每个元素,从而产生更快、更简洁的代码。
**注意:**当在链式表达式中使用多个 Pandas .str
访问器方法时,请确保在每个特定字符串函数之前使用 .str
访问器。例如,users["name"].str[1:].str.lower()
是正确的,而 users["name"].str[1:].lower()
则不正确,因为它缺少 .lower()
方法之前的第二个 .str
访问器。
import pandas as pd
def fix_names(users: pd.DataFrame) -> pd.DataFrame:
users['name'] = users['name'].str[0].str.upper() + users['name'].str[1:].str.lower()
return users.sort_values('user_id')
查找拥有有效邮箱的客户
题目来源:1517. 查找拥有有效邮箱的用户 - 力扣(LeetCode)
题目:
Users表:
查询拥有有效邮箱的用户。
有效的邮箱包含符合下列条件的前缀名和域名:
- 前缀名是包含字母(大写或小写)、数字、下划线
'_'
、句点'.'
和/或横杠'-'
的字符串。前缀名必须以字母开头。- 域名是
'@leetcode.com'
。按任意顺序返回结果表。
查询格式如下所示。
示例:
题解:
参考:1517. 查找拥有有效邮箱的用户 - 力扣(LeetCode)
一般来说,如果你被要求匹配一个字符串,应该最先想到写一个正则表达式模式进行匹配。
正则表达式提供各种功能,以下是一些相关功能:
-
^
:表示一个字符串或行的开头 -
[a-z]
:表示一个字符范围,匹配从 a 到 z 的任何字符。
-
[0-9]
:表示一个字符范围,匹配从 0 到 9 的任何字符。 -
[a-zA-Z]
:这个变量匹配从 a 到 z 或 A 到 Z 的任何字符。请注意,你可以在方括号内指定的字符范围的数量没有限制,您可以添加想要匹配的其他字符或范围。 -
[^a-z]
:这个变量匹配不在 a 到 z 范围内的任何字符。请注意,字符 ^ 用来否定字符范围,它在方括号内的含义与它的方括号外表示开始的含义不同。
-
[a-z]*
:表示一个字符范围,匹配从 a 到 z 的任何字符 0 次或多次。 -
[a-z]+
:表示一个字符范围,匹配从 a 到 z 的任何字符 1 次或多次。 -
.
:匹配任意一个字符。 -
\.
:表示句点字符。请注意,反斜杠用于转义句点字符,因为句点字符在正则表达式中具有特殊含义。还要注意,在许多语言中,你需要转义反斜杠本身,因此需要使用\.。 -
$
:表示一个字符串或行的结尾。
核心思想是将 name 列的第一个字符从其余字符分开,相应地改变它们的大小写,最后把他们拼回在一起。
import pandas as pd
def valid_emails(users: pd.DataFrame) -> pd.DataFrame:
# 注意我们如何使用原始字符串(在前面放一个‘r’)来避免必须转义反斜杠
# 还要注意,我们对`@`字符进行了转义,因为它在某些正则表达式中具有特殊意义
return users[users["mail"].str.match(r"^[a-zA-Z][a-zA-Z0-9_.-]*\@leetcode\.com$")]
患某种疾病的患者
题目来源:1527. 患某种疾病的患者 - 力扣(LeetCode)
题目:
Patients表
查询患有 I 类糖尿病的患者 ID (patient_id)、患者姓名(patient_name)以及其患有的所有疾病代码(conditions)。I 类糖尿病的代码总是包含前缀
DIAB1
。按 任意顺序 返回结果表。
查询结果格式如下示例所示。
示例:
题解:
参考:1527. 患某种疾病的患者 - 力扣(LeetCode)
符合条件的大致包含两种情况:
- 条件代码以
"DIAB1"
开头。 - 条件代码包含
" DIAB1"
,即有一个空格在前。
import pandas as pd
def find_patients(patients: pd.DataFrame) -> pd.DataFrame:
return patients[patients["conditions"].str.startswith("DIAB1") | patients["conditions"].str.contains(" DIAB1", regex=False)]