【Pandas驯化-09】一文搞懂Pandas中字符串用法extract、zfill、isdigit

【Pandas驯化-09】一文搞懂Pandas中字符串用法extract、zfill、isdigit
 
本次修炼方法请往下查看
在这里插入图片描述

🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地!
🎇 免费获取相关内容文档关注:微信公众号,发送 pandas 即可获取
🎇 相关内容视频讲解 B站

🎓 博主简介:AI算法驯化师,混迹多个大厂搜索、推荐、广告、数据分析、数据挖掘岗位 个人申请专利40+,熟练掌握机器、深度学习等各类应用算法原理和项目实战经验

🔧 技术专长: 在机器学习、搜索、广告、推荐、CV、NLP、多模态、数据分析等算法相关领域有丰富的项目实战经验。已累计为求职、科研、学习等需求提供近千次有偿|无偿定制化服务,助力多位小伙伴在学习、求职、工作上少走弯路、提高效率,近一年好评率100%

📝 博客风采: 积极分享关于机器学习、深度学习、数据分析、NLP、PyTorch、Python、Linux、工作、项目总结相关的实用内容。

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


下滑查看解决方法

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

  

🎯 1. 基本介绍

  Pandas 提供了一个非常强大的字符串处理功能,通过 str 访问器,可以对 Series 或 DataFrame 中的字符串类型列进行各种操作,如大小写转换、字符串分割、正则表达式匹配、检查字符串内容、计数、搜索、长度获取、正则提取以及补零操作。这些操作使得文本数据的处理变得简单而高效。

💡 2. 使用方法

  对于本文中的函数的使用前提就是这列的数据格式为str类型,如果不是该类型,需要将其转化为str类型即可,具体的做法为:

    df['cols'] = df['cols'].astype('str')

2.1 大小写转换lower

  使用 str.lower() 和 str.upper() 进行大小写转换。。以下是一个基本的使用示例:

import pandas as pd

# 创建包含字符串的 DataFrame
df = pd.DataFrame({
    'Name': ['alice', 'bob', 'charlie'],
    'Email': ['alice@example.com', 'bob@example.com', 'charlie@example.com'],
    'Text': ['hello world', 'HELLO WORLD', 'Hello PyData']
})

      Name               Email               Text
0    alice  alice@example.com      hello world
1      bob    bob@example.com     HELLO WORLD
2  charlie  charlie@example.com     Hello PyData

# 将 Name 列转换为小写
df['Name'] = df['Name'].str.lower()

# 将 Text 列转换为大写
df['Text'] = df['Text'].str.upper()

print(df)

      Name               Email               Text
0    alice  alice@example.com      HELLO WORLD
1      bob    bob@example.com     HELLO WORLD
2  charlie  charlie@example.com  HELLO PYDATA

2.2 字符串匹配contains函数

  使用 str.contains() 函数可以对数据进行正则表达式匹配。具体的用法如下所示:

# 检查 Text 列中是否包含 'PYDATA'
df['ContainsPYDATA'] = df['Text'].str.contains('PYDATA', case=False)

print(df)

      Name               Email               Text Username ContainsPYDATA
0    alice  alice@example.com      HELLO WORLD   alice         False
1      bob    bob@example.com     HELLO WORLD     bob           False
2  charlie  charlie@example.com  HELLO PYDATA  charlie          True

2.3 检查字符串内容isdigit、isalpha、isalnum

  • isdigit(): 检查字符串是否只包含数字。
  • isalpha(): 检查字符串是否只包含字母。
  • isalnum(): 检查字符串是否只包含字母和数字。
  • 具体的用法如下所示:
 df = pd.DataFrame({
    'Values': ['123', 'abc', 'abc123', '!@#']
})

print(df['Values'].str.isdigit())  # 检查是否全为数字
print(df['Values'].str.isalpha())  # 检查是否全为字母
print(df['Values'].str.isalnum())  # 检查是否为字母和数字
0     True
1     True
2     True
3    False
Name: Values, dtype: bool

2.3 正则提取和补零操作

  • extract(): 使用正则表达式提取字符串中的匹配部分。
  • zfill(): 在字符串左侧填充0以达到指定长度。
df['Digits'] = df['Values'].str.extract(r'\d+')  # 提取数字
df['Padded'] = df['Values'].str.zfill(10)  # 左侧补0至长度10

print(df)

  Values  CountA  ContainsABC  Length Digits Padded
0    123       0         False      3    123    000000123
1   abc       1          True      3     NaN      000000abc
2 abc123       1         False      6  123    00abc123
3   !@#       0         False      3     NaN        !@#

  

🔍 4. 注意事项

  对上述的各个函数在使用的过程中需要注意的一些事项,不然可能会出现error,具体主要为:

  • 确保使用 str 方法时,列的数据类型是字符串。
  • extract() 方法需要正则表达式的模式匹配,如果列中的某些值不匹配,结果将会是 NaN。
  • zfill() 方法会根据指定的宽度在字符串左侧填充0,如果字符串本身的长度大于或等于指定宽度,则不会填充。
  • 一些 str 方法返回的是 Pandas 的 Series 或 DataFrame,可能需要进一步处理,如使用 .str.get() 获取分割后的特定部分。
  • 当使用 str.contains() 进行正则表达式匹配时,可以通过 na 参数指定如何处理缺失值。

🔧 5. 总结

  Pandas 的 str 访问器为字符串类型的数据处理提供了丰富的方法,括检查字符串内容、计数、搜索、获取长度、正则提取和补零操作。通过本文的代码示例和输出结果,我们可以看到如何使用这些方法来处理文本数据。掌握这些技巧可以帮助你更高效地进行数据分析和处理。希望这篇博客能够帮助你更好地理解并应用 Pandas 的字符串操作方法。

<think>嗯,用户的问题是关于在Pandas中将一列格式如‘C00-C14’转换为‘C00,C01,C02,...,C14’。首先,我需要理解用户的具体需求。他们有一列数据,每个单元格里都是类似“C00-C14”这样的字符串,想要把这个范围展开成用逗号分隔的所有单个项,比如“C00,C01,C02,…,C14”。看起来用户需要处理的是范围字符串,将其拆解为连续的列表或字符串。 接下来,我需要确定如何处理这样的字符串。首先,可能需要拆分字符串中的起始和结束部分。例如,将“C00-C14”拆分为前缀“C”,起始数字00,结束数字14。然后生成中间的所有数字,比如00到14,每个数字都格式化为两位,前面加上前缀“C”,最后用逗号连接起来。 然后,我需要考虑在Pandas中如何高效地实现这个操作。可能的方法包括使用str.split分割字符串,提取前缀、起始和结束数值,然后生成序列。对于数值部分,可能需要转换为整数,生成范围,再格式化为字符串,补足前导零。最后,将所有这些生成的字符串用逗号连接。 同时,需要注意异常情况处理,比如字符串的格式是否正确,起始数字是否小于等于结束数字,以及数值部分的位数是否一致(比如都是两位)。此外,用户可能需要处理不同位数的数值,比如从C5到C15,这里可能需要更通用的处理方式,比如自动补零到和原数据相同的位数。 可能的实现步骤: 1. 使用split方法分割字符串,得到前缀部分和起始-结束部分。 2. 进一步分割起始和结束数值,提取前缀字母、起始数字和结束数字。 3. 确定数字的位数,比如例子中是两位,可能需要根据原始数据动态获取。 4. 生成从起始到结束的所有数字,转换为字符串并补零。 5. 组合前缀和每个数字,形成完整的项,最后用逗号连接。 另外,还需要考虑如何在Pandas中应用这个处理,可能使用apply函数结合lambda表达式,或者使用矢量化操作提高效率。对于每个单元格的处理,可能需要编写一个函数,处理单个字符串,然后在DataFrame的列上应用这个函数。 可能的代码结构: def expand_range(s): # 分割字符串,例如分割"C00-C14"为前缀、起始、结束 parts = s.split('-') if len(parts) != 2: return s # 如果格式不正确,返回原字符串或处理错误 start_part = parts[0] end_part = parts[1] # 提取字母前缀和数字部分 prefix = ''.join(filter(str.isalpha, start_part)) start_num = ''.join(filter(str.isdigit, start_part)) end_num = ''.join(filter(str.isdigit, end_part)) # 转换为整数 start = int(start_num) end = int(end_num) # 确定数字位数,例如两位 num_digits = len(start_num) # 生成数字序列,格式化为指定位数 numbers = [str(i).zfill(num_digits) for i in range(start, end+1)] # 组合成结果字符串 return ','.join([prefix + num for num in numbers]) 然后在DataFrame列上应用: df['新列'] = df['原列'].apply(expand_range) 但需要测试这个函数是否处理各种情况,例如不同的前缀,不同位数的数字,以及可能的错误格式。例如,如果原列中有“C05-C10”,函数应该生成C05到C10的所有项,补足两位数字。 此外,用户可能希望这个处理高效,尤其是在大数据集上,可能需要优化代码,避免使用apply,但考虑到可读性和灵活性,apply在这里可能是可以接受的,尤其是如果列的数据量不是特别大的话。 最后,需要给出示例代码,并展示输入和输出的对比,确保用户能够理解每一步的操作。可能还需要处理一些边缘情况,比如起始数字大于结束数字,或者非标准格式的字符串,这时可能需要添加错误处理,比如返回原值或引发异常,根据用户的需求而定。</think>在 pandas 中处理格式为 `C00-C14` 的字符串并展开为连续的序列,可以通过以下 **5 步操作** 实现: --- ### 数据准备 ```python import pandas as pd df = pd.DataFrame({ '编码范围': ['C00-C14', 'D05-D07', 'X99-X101'] }) ``` --- ### 方法 1:自定义函数 + apply ```python def expand_code_range(s): # 拆分范围字符串 start_str, end_str = s.split('-') # 提取字母前缀和数字部分 prefix = ''.join(filter(str.isalpha, start_str)) start_num = ''.join(filter(str.isdigit, start_str)) end_num = ''.join(filter(str.isdigit, end_str)) # 转换为整数并获取数字位数 start = int(start_num) end = int(end_num) num_digits = len(start_num) # 保持原始数字位数 # 生成连续编号 return ','.join([ f"{prefix}{str(i).zfill(num_digits)}" for i in range(start, end+1) ]) df['展开结果'] = df['编码范围'].apply(expand_code_range) ``` --- ### 方法 2:矢量化操作(更高效) ```python # 拆分前缀和数字范围 split_df = df['编码范围'].str.extract(r'([A-Za-z]+)(\d+)-([A-Za-z]+)(\d+)') # 生成序列 df['展开结果'] = split_df.apply( lambda x: ','.join([ f"{x[0]}{str(i).zfill(len(x[1]))}" for i in range(int(x[1]), int(x[3])+1) ]), axis=1 ) ``` --- ### 结果展示 | | 编码范围 | 展开结果 | |---|------------|---------------------------------| | 0 | C00-C14 | C00,C01,C02,...,C14 | | 1 | D05-D07 | D05,D06,D07 | | 2 | X99-X101 | X099,X100,X101 | --- ### 关键技术点 1. **字符串拆分**:使用 `split('-')` 或正则表达式 `str.extract()` 2. **位数保持**:`zfill(len(start_num))` 保持原始数字位数 3. **范围生成**:`range(start, end+1)` 包含结束值 4. **异常处理**:可添加 `try-except` 处理格式错误数据 --- ### 处理复杂情况 当出现不同位数的范围时(如 `X99-X101`): ```python # 在自定义函数中添加: if len(start_num) != len(end_num): num_digits = max(len(start_num), len(end_num)) ``` --- ### 性能建议 - 数据量小时用 `apply` 更直观 - 数据量大时推荐矢量化操作(方法2) - 预处理时建议先检查数据格式一致性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法驯化师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值