如何移除Pandas DataFrame指定列含字母的行?
解决Pandas DataFrame移除指定列含字母行的问题
你的代码有两个关键问题导致没生效:
- 判断逻辑错误:
str.isalpha()只会识别完全由字母组成的内容,但你要移除的是只要包含字母的行,这个方法覆盖不了混合字母和数字的情况(比如123abc)。 - 未修改原DataFrame:你用
sysco_all.loc[...]切片后,没有把结果赋值回原变量,也没使用inplace参数,原DataFrame根本没变化。
修正后的完整代码
import pandas as pd # 读取文件路径并去除引号 sysco1file = input("Input path of FS1 file: ").replace('"', "") sysco2file = input("Input path of FS2 file: ").replace('"', "") sysco3file = input("Input path of FS3 file: ").replace('"', "") # 读取制表符分隔的文件,所有值按字符串处理 sysco_1 = pd.read_csv(sysco1file, sep='\t', dtype=str) sysco_2 = pd.read_csv(sysco2file, sep='\t', dtype=str) sysco_3 = pd.read_csv(sysco3file, sep='\t', dtype=str) # 合并三个文件的行 sysco_all = pd.concat([sysco_1, sysco_2, sysco_3]) # 移除CompAcctNum列的空值 sysco_all.dropna(subset=['CompAcctNum'], inplace=True) # 确保所有值为字符串类型 sysco_all = sysco_all.astype(str) # 核心修正:移除CompanyNumber列包含字母的行 # 使用正则匹配所有字母,取反后筛选行并赋值回原变量 sysco_all = sysco_all[~sysco_all['CompanyNumber'].str.contains('[a-zA-Z]', na=False)] # 写入CSV(建议加上index=False避免生成多余的索引列) sysco_all.to_csv(r"C:\Users\user\Desktop\testcsvfile.csv", index=False)
关键说明
str.contains('[a-zA-Z]'):用正则表达式匹配任意大小写字母,只要单元格里有字母就会返回True,取反(~)后就会筛选出不包含字母的行。na=False:防止单元格为空时出现报错,直接把空值视为不包含字母(如果需要移除空值可以提前处理)。- 赋值回原变量:必须把筛选后的结果重新赋值给
sysco_all,或者用sysco_all.drop(sysco_all[sysco_all['CompanyNumber'].str.contains('[a-zA-Z]')].index, inplace=True)这种原地修改的方式。
针对你给出的示例验证
如果是处理示例中的B列,代码可以这么写:
import pandas as pd data = { 'A': [9,8,7,6], 'B': ['1','2','cat','4'], 'C': ['a','b','c','d'] } df = pd.DataFrame(data) # 移除B列含字母的行 df = df[~df['B'].str.contains('[a-zA-Z]')] print(df)
输出结果就是你期望的:
A B C 0 9 1 a 1 8 2 b 3 6 4 d
内容的提问来源于stack exchange,提问作者Michael Crosby
相关产品推荐
相关产品推荐

