Pandas DataFrame删除匹配指定多值的行失败求助
解决CSV行过滤无效的问题
首先看你代码里的核心问题:你用了&(逻辑与)来判断Subscription SKU同时等于两个不同的值,这显然永远不会成立——一个SKU不可能既是155425976806又是361867226799,所以自然筛选不出任何行来删除。
另外还有个容易忽略的细节:CSV里的Subscription SKU列同时包含字符串(比如NRS2718)和数字格式的内容,Pandas读取时会自动把整列识别为字符串类型,这时候你用整数去匹配就会失败,找不到对应的行。
修正后的代码方案
这里提供两种可靠的过滤方式,你可以任选其一:
方式1:使用isin()方法(推荐,代码更简洁)
from sqlalchemy import create_engine import urllib import pyodbc import pandas as pd # 读取CSV文件 df = pd.read_csv("./data.csv") # 定义需要删除的SKU列表(用字符串匹配,适配CSV读取后的类型) invalid_skus = ['155425976806', '361867226799'] # 过滤掉包含无效SKU的行(~表示取反) df = df[~df['Subscription SKU'].isin(invalid_skus)] # 数据库推送代码保持不变 quoted = urllib.parse.quote_plus("Driver={ODBC Driver 17 for SQL Server};SERVER=10.1.1.11;uid=myuser;pwd=mypass;DATABASE=LICENSES") engine = create_engine('mssql+pyodbc:///?odbc_connect={}'.format(quoted)) df.to_sql('DataTable', if_exists = 'replace', schema='dbo', con=engine) # 验证导入结果 result = engine.execute('SELECT COUNT(*) FROM [dbo].[DataTable]') print(result.fetchall())
方式2:修正逻辑运算符为|(逻辑或)
如果你更习惯用drop的方式,只需把逻辑判断改对,并匹配正确的数据类型:
# 读取CSV后执行过滤 indexSKU = df[(df['Subscription SKU'] == '155425976806') | (df['Subscription SKU'] == '361867226799')].index df.drop(indexSKU, inplace=True) # 后续数据库操作代码不变
补充验证小技巧
你可以在过滤前先运行print(df['Subscription SKU'].dtype),确认该列的类型——如果输出是object,就说明这列是字符串类型,必须用字符串来匹配;如果是数值类型,再用整数匹配即可。
内容的提问来源于stack exchange,提问作者ChrisS
相关产品推荐
相关产品推荐

