如何在Python DataFrame中移除含指定子串的行及代码问题排查
移除包含特定子串的行:修正你的Pandas代码
你卡在了生成正确的筛选掩码上——你的minus_testing_dashboard变量其实只是标记了哪些行包含testing-dashboard的布尔值序列(还不必要地做了reset_index),根本没有保留原始数据的列,所以后面调用minus_testing_dashboard['Machine ID']肯定会报错。咱们一步步来修正:
1. 生成正确的筛选掩码
你需要移除任意选中列中包含testing-dashboard或dev的行,所以首先要生成一个掩码,标记出哪些行需要保留(即不包含任何目标子串的行):
# 定义要排除的子串列表,方便后续修改 exclude_substrings = ['testing-dashboard', 'dev'] # 生成掩码:~表示取反,保留不包含任何目标子串的行 mask = ~selected_raw_data.apply( lambda row: row.astype(str).str.contains('|'.join(exclude_substrings)).any(), axis=1 )
这里用|把多个子串拼成正则表达式的“或”条件,一次匹配多个目标子串;astype(str)是为了确保所有列都能被str.contains处理,避免非字符串类型(比如数值列)导致的错误。
2. 过滤数据集并计算唯一值
用掩码过滤selected_raw_data,得到干净的数据集后再计算唯一的Machine ID数量:
# 过滤数据,drop=True避免生成多余的index列 filtered_data = selected_raw_data[mask].reset_index(drop=True) # 现在可以正常获取Machine ID的唯一值了 unique_desktops = filtered_data['Machine ID'].nunique() print(unique_desktops)
完整修正后的代码
import numpy as np import pandas as pd # 读取原始CSV raw_data = pd.read_csv('No License Key.csv', delimiter=',', keep_default_na=False, low_memory=False) # 选择需要的列,同时重置索引(drop=True避免保留原索引) selected_raw_data = raw_data[['App Config', 'App Name', 'App UUID', 'Machine ID', 'Estimated Company']].reset_index(drop=True) print(selected_raw_data.head(25)) # 定义要排除的子串 exclude_substrings = ['testing-dashboard', 'dev'] # 生成筛选掩码 mask = ~selected_raw_data.apply( lambda row: row.astype(str).str.contains('|'.join(exclude_substrings)).any(), axis=1 ) # 过滤得到目标数据集 filtered_data = selected_raw_data[mask].reset_index(drop=True) # 计算唯一Machine ID数量 unique_desktops = filtered_data['Machine ID'].nunique() print(unique_desktops)
额外小技巧
如果只需要检查特定列(比如只看App Name列),可以不用遍历整行,直接针对列操作,效率更高:
mask = ~selected_raw_data['App Name'].astype(str).str.contains('|'.join(exclude_substrings))
内容的提问来源于stack exchange,提问作者Steve Wood
相关产品推荐
相关产品推荐

