如何在Pandas中移除含小写字母的字符串列值(含NaN处理)
解决Pandas字符串列移除含小写字母内容的问题
需求:在Pandas的字符串列中移除包含小写字母的字符串,列中可能存在NaN或单行包含多个字符串。
原DataFrame
| Column1 | Column2 | Column3 |
|---|---|---|
| NaN | NaN | NaN |
| BCDE8ENGUGUETNJN | NaN | NaN |
| vk4JGFIEh5 | NaN | NaN |
| t7chJGWYEj | BCSTACK | BCTENSORFLOW |
| 5hNIE7EEP | OVERFLOW | NaN |
尝试的错误代码
df['Column1'].fillna('nan',inplace=True) df['Column2'].fillna('nan',inplace=True) df['Column3'].fillna('nan',inplace=True) lowerletterpattern = r'[a-z]*' mask1 = df['Column1'].str.contains(lowerletterpattern) df.loc[mask1,'Column1'] = np.nan mask2 = df['Column2'].str.contains(lowerletterpattern) df.loc[mask2,'Column2'] = np.nan mask3 = df['Column3'].str.contains(lowerletterpattern) df.loc[mask3,'Column3'] = np.nan
运行后所有值均为NaN,不符合预期。
问题分析
- 正则表达式
r'[a-z]*'匹配0个或多个小写字母,任何字符串(包括全大写/数字的字符串)都会被匹配,因为0个小写字母也满足条件,导致所有行被替换为NaN。 - 提前将NaN填充为字符串
'nan',该字符串包含小写字母,最终也会被匹配替换回NaN,进一步导致全表空值。
正确解法
无需提前填充NaN,直接匹配至少一个小写字母的字符串,将其替换为NaN即可:
import pandas as pd import numpy as np # 构造原DataFrame(已有可跳过此步骤) data = { 'Column1': [np.nan, 'BCDE8ENGUGUETNJN', 'vk4JGFIEh5', 't7chJGWYEj', '5hNIE7EEP'], 'Column2': [np.nan, np.nan, np.nan, 'BCSTACK', 'OVERFLOW'], 'Column3': [np.nan, np.nan, np.nan, 'BCTENSORFLOW', np.nan] } df = pd.DataFrame(data) # 批量处理所有目标列 for col in df.columns: # na=False:NaN值不参与匹配,保持原状态 mask = df[col].str.contains(r'[a-z]', na=False) df.loc[mask, col] = np.nan
最终结果
| Column1 | Column2 | Column3 |
|---|---|---|
| NaN | NaN | NaN |
| BCDE8ENGUGUETNJN | NaN | NaN |
| NaN | NaN | NaN |
| NaN | BCSTACK | BCTENSORFLOW |
| NaN | OVERFLOW | NaN |
内容的提问来源于stack exchange,提问作者ProgramNewHand
相关产品推荐
相关产品推荐

