Pandas【字符串函数】

无效的推文

题目来源:1683. 无效的推文 - 力扣(LeetCode)

题目:

Tweets表:

image-20230802114051842

查询所有无效推文的编号(ID)。当推文内容中的字符数严格大于 15 时,该推文是无效的。

任意顺序返回结果表。

查询结果格式如下所示:

示例:

image-20230802114104880

题解:

参考:1683. 无效的推文 - 力扣(LeetCode)

使用行过滤的方法,找出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表:

image-20230802121737859

计算每个雇员的奖金。如果一个雇员的 id 是 奇数 并且他的名字不是以 'M' 开头,那么他的奖金是他工资的 100% ,否则奖金为 0

返回的结果按照 employee_id 排序。

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

示例:

image-20230802121815030

题解:

参考: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表:

image-20230802124254126

修复名字,使得只有第一个字符是大写的,其余都是小写的。

返回按 user_id 排序的结果表。

返回结果格式示例如下。

示例:

image-20230802124334673

题解:

参考: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表:

image-20230803113353762

查询拥有有效邮箱的用户。

有效的邮箱包含符合下列条件的前缀名和域名:

  • 前缀名是包含字母(大写或小写)、数字、下划线 '_'、句点 '.' 和/或横杠 '-' 的字符串。前缀名必须以字母开头。
  • 域名'@leetcode.com'

按任意顺序返回结果表。

查询格式如下所示。

示例:

image-20230803113602968

题解:

参考:1517. 查找拥有有效邮箱的用户 - 力扣(LeetCode)

一般来说,如果你被要求匹配一个字符串,应该最先想到写一个正则表达式模式进行匹配。

正则表达式提供各种功能,以下是一些相关功能:

  1. ^:表示一个字符串或行的开头

  2. [a-z]:表示一个字符范围,匹配从 a 到 z 的任何字符。

  • [0-9]:表示一个字符范围,匹配从 0 到 9 的任何字符。

  • [a-zA-Z]:这个变量匹配从 a 到 z 或 A 到 Z 的任何字符。请注意,你可以在方括号内指定的字符范围的数量没有限制,您可以添加想要匹配的其他字符或范围。

  • [^a-z]:这个变量匹配不在 a 到 z 范围内的任何字符。请注意,字符 ^ 用来否定字符范围,它在方括号内的含义与它的方括号外表示开始的含义不同。

  1. [a-z]*:表示一个字符范围,匹配从 a 到 z 的任何字符 0 次或多次。

  2. [a-z]+:表示一个字符范围,匹配从 a 到 z 的任何字符 1 次或多次。

  3. .:匹配任意一个字符。

  4. \.:表示句点字符。请注意,反斜杠用于转义句点字符,因为句点字符在正则表达式中具有特殊含义。还要注意,在许多语言中,你需要转义反斜杠本身,因此需要使用\.。

  5. $:表示一个字符串或行的结尾。

核心思想是将 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表

image-20230803125333535

查询患有 I 类糖尿病的患者 ID (patient_id)、患者姓名(patient_name)以及其患有的所有疾病代码(conditions)。I 类糖尿病的代码总是包含前缀 DIAB1

任意顺序 返回结果表。

查询结果格式如下示例所示。

示例:

image-20230803125417954

题解:

参考:1527. 患某种疾病的患者 - 力扣(LeetCode)

符合条件的大致包含两种情况:

  1. 条件代码以 "DIAB1" 开头。
  2. 条件代码包含 " 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)]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pandas提供了一系列的字符串函数,用于对DataFrame中的字符串数据进行操作。这些函数以"str"开头,并可用于对Series和DataFrame中的字符串列进行处理。一些常用的Pandas字符串函数包括:lower()将字符串转换为小写、upper()将字符串转换为大写、len()返回字符串的长度、strip()去除字符串两侧的空白字符、contains()判断字符串是否包含某个子串、replace()替换字符串中的某个子串、split()将字符串拆分成多个子串并返回一个列表等。这些函数的使用可以大大提高处理字符串数据的效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [pandas中的字符串处理函数](https://blog.csdn.net/weixin_43569478/article/details/107344336)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Pandas 字符串操作函数](https://blog.csdn.net/weixin_38052444/article/details/82851257)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值