You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 20:08:11