如何在Python Pandas中查找仅含单个标点符号值的列?
问题描述
现有如下结构的DataFrame:
COL1 | COL2 | COL3 -----|------|-------- abc | P | 123 b.bb | , | 22 1 | B | 2 ... |... | ...
需要找出仅包含指定标点符号(标点范围:!"#$%&'()*+,-./:;<=>?@[]^_{|}~`)的列。注意:若列中存在“标点符号与其他字符共存”的元素(如COL1中的`b.bb`),则该列不符合要求。
注:示例中COL2的P、B应为标点符号输入失误,否则不符合“仅包含标点”的要求
预期结果(仅保留符合条件的COL2):
COL2 ------- P , B ...
解决方案
使用Python的Pandas库可快速实现需求,以下是两种场景的代码实现:
场景1:严格匹配“仅包含标点符号”的列
代码实现
import pandas as pd # 构造修正后的示例DataFrame(COL2替换为标点符号) data = { 'COL1': ['abc', 'b.bb', '1'], 'COL2': ['!', ',', '@'], 'COL3': ['123', '22', '2'] } df = pd.DataFrame(data) # 正则表达式:匹配仅由指定标点组成的字符串(自动去除元素前后空格) punct_regex = r'^[!"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~]+$' # 筛选所有元素均符合规则的列 valid_columns = df.columns[df.apply(lambda col: col.str.strip().str.fullmatch(punct_regex).all())] # 获取结果 result_df = df[valid_columns] print(result_df)
输出结果
COL2 0 ! 1 , 2 @
场景2:保留“无标点与其他字符混合元素”的列
若你的真实需求是允许列中存在纯字母/数字元素,仅排除包含“标点+其他字符”混合元素的列,可使用以下代码:
import pandas as pd data = { 'COL1': ['abc', 'b.bb', '1'], 'COL2': ['P', ',', 'B'], 'COL3': ['123', '22', '2'] } df = pd.DataFrame(data) # 定义标点符号集合 punct_set = set(r'!"#$%&\'()*+,-./:;<=>?@[]^_`{|}~') # 判断元素是否同时包含标点和非标点字符 def is_mixed(s): s_clean = s.strip() has_punct = any(c in punct_set for c in s_clean) has_non_punct = any(c not in punct_set for c in s_clean) return has_punct and has_non_punct # 筛选无混合元素的列 valid_columns = df.columns[~df.apply(lambda col: col.apply(is_mixed).any())] result_df = df[valid_columns] print(result_df)
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

