如何用Pandas删除含4位小数或5位整数的DataFrame行?
删除DataFrame中含特定格式数值的行
要删除gbs2中包含4位小数(如1.2345)或5位整数(如12345)的行,核心是用正则表达式匹配目标格式的数值,再定位并删除对应行。以下是具体实现:
步骤1:明确正则匹配规则
针对两种目标格式,构造正则表达式:
- 4位小数:
\d+\.\d{4}→ 匹配任意数字开头,后跟小数点和4位数字的模式 - 5位整数:
\b\d{5}\b→ 匹配独立的5位数字(用单词边界\b避免匹配更长数字的子串)
将两者组合为:r'(\d+\.\d{4}|\b\d{5}\b)'
步骤2:定位需删除的行
对Produced Qty列使用str.contains()方法匹配正则,得到标记需删除行的布尔序列:
import pandas as pd # 原数据构造 name = pd.Series(['Product A', 'Product B', 'Product C']) Produced_Qty = pd.Series(['ABC 1.407', 'NOP 1.6345', 'XYZ 1.3144/1.7523 ect']) Passed_Qty = pd.Series([499768, 756662, 301297]) gbs2 = pd.DataFrame({'Name':name, 'Produced Qty': Produced_Qty, 'Passed Qty':Passed_Qty}) # 生成匹配标记 mask = gbs2['Produced Qty'].str.contains(r'(\d+\.\d{4}|\b\d{5}\b)', regex=True)
步骤3:删除目标行
可以通过两种方式实现:
方式一:直接过滤保留符合要求的行(更简洁)
gbs2_filtered = gbs2[~mask]
方式二:使用drop()方法删除行
# 获取需删除的行索引 drop_indices = gbs2[mask].index gbs2_filtered = gbs2.drop(drop_indices)
结果验证
处理后gbs2_filtered仅保留Product A的行,符合需求。该方案不受字符串长度、数值位置的影响,只要字符串中存在目标格式的数值,就会被准确定位并删除。
内容的提问来源于stack exchange,提问作者Bing Shuen
相关产品推荐
相关产品推荐

