如何检查DataFrame中字符串的字符数并修正格式错误的AGE列整数数据?
解决两个Pandas数据清洗问题
嘿,这两个都是日常数据处理中很常见的清洗需求,我来给你一步步拆解解决方案:
问题1:检查字符串列字符数,移除长度为3且数字开头的首字符
首先,我们需要确保目标列是字符串类型(避免非字符串值干扰判断),然后通过**Pandas字符串访问器str**来实现条件判断和处理,推荐用矢量化操作(比循环高效太多):
代码示例
import pandas as pd # 先构造一个示例DataFrame df = pd.DataFrame({'target_col': ['1ab', 'abc', '2cd', 'defg', '3xy', '45']}) # 核心处理逻辑: # 1. 转字符串类型确保统一处理 # 2. mask方法:当条件满足时替换为切片后的值,否则保留原内容 df['target_col'] = df['target_col'].astype(str).mask( # 条件:长度为3 且 首字符是数字 (df['target_col'].str.len() == 3) & (df['target_col'].str[0].str.isdigit()), # 满足条件时,取从第2个字符开始的所有内容(移除首字符) df['target_col'].str[1:] )
逻辑说明
astype(str):把列中所有值转成字符串,避免整数/浮点数类型导致的str方法报错str.len() ==3:筛选出长度为3的字符串str[0].str.isdigit():检查字符串的首字符是否为数字mask():相当于"条件替换"——当条件为True时,用后面的切片值替换原内容,否则保留原值
问题2:修复AGE列的错误前缀(8/9开头的三位数字)
这个问题里AGE是整数类型,我们需要先转成字符串做前缀判断,处理后再转回整数,同样用矢量化操作更高效:
步骤1:构造示例DataFrame
import pandas as pd data = { 'OCCUPATION': ['Employed', 'Employed', 'Student', 'Self-Employed'], 'AGE': [26, 45, 812, 926], 'AREA_CODE': ['011', '012', '021', '011'] } df = pd.DataFrame(data)
步骤2:高效修复AGE列(矢量化方式)
# 先创建筛选掩码:AGE转字符串后长度为3,且以8或9开头 mask = (df['AGE'].astype(str).str.len() == 3) & (df['AGE'].astype(str).str.startswith(('8', '9'))) # 对符合条件的行,移除前缀后转回整数 df.loc[mask, 'AGE'] = df.loc[mask, 'AGE'].astype(str).str[1:].astype(int)
替代方案(用apply,适合小数据量)
如果你的数据量很小,也可以用apply写个简单的lambda函数:
df['AGE'] = df['AGE'].astype(str).apply( lambda x: int(x[1:]) if len(x) ==3 and x[0] in ['8','9'] else int(x) )
最终结果
处理后你会得到预期的DataFrame:
| OCCUPATION | AGE | AREA_CODE |
|---|---|---|
| Employed | 26 | 011 |
| Employed | 45 | 012 |
| Student | 12 | 021 |
| Self-Employed | 26 | 011 |
内容的提问来源于stack exchange,提问作者Mazil_tov998
相关产品推荐
相关产品推荐

