如何从现有DataFrame筛选特定列不含指定字符的行并生成全列新DataFrame
问题原因
你当前的实现只遍历了指定单列的数值,存入列表的也仅为该列的内容,自然无法保留原DataFrame的其他列。此外,!=运算符无法直接匹配正则表达式规则,你的匹配逻辑也无法生效。
最优实现方案(推荐)
pandas提供了原生的矢量化字符串匹配方法,不需要自行写循环,运行效率更高,且可以直接保留原表所有列:
- 如果你要匹配的是普通固定字符(不是正则规则):
# 筛选`column`列不包含`特定字符`的所有行,保留全部列 new_df = old_dataframe[~old_dataframe['column'].str.contains('特定字符', na=False)]
- 如果你要匹配的是你示例中的正则规则:
# 筛选`column`列不匹配正则`^[^\s]`(开头不是非空白字符)的所有行,保留全部列 import re new_df = old_dataframe[~old_dataframe['column'].str.contains(r'^[^\s]', regex=True, na=False)]
注:代码中的~是pandas里的逻辑取反运算符,na=False表示将列中的空值判定为「不匹配目标规则」,你可以根据自己的空值处理需求调整为na=True。
循环写法兼容(不推荐,仅做逻辑参考)
如果你需要保留循环写法的逻辑,可以遍历整行再组装,该方法数据量超过1万行时运行效率会远低于上面的矢量化方案:
%%time import re new_list = [] for _, row in old_dataframe.iterrows(): # 校验指定列是否不匹配正则规则 if not re.match(r'^[^\s]', str(row['column'])): new_list.append(row) # 组装为新的DataFrame,保留所有原列 new_df = pd.DataFrame(new_list)
内容的提问来源于stack exchange,提问作者wow
相关产品推荐
相关产品推荐

