使用isin筛选DataFrame时仅返回CSV首行数据的问题排查
问题原因与解决方案
你的问题出在读取无表头CSV文件的方式上:
- 当你用
pd.read_csv("symbols.csv")读取没有表头的CSV时,pandas会默认把第一行内容AKAM当成DataFrame的列名,第二行AKRO当成唯一的数据行。此时mikey_symbols是一个仅包含1行1列的DataFrame,列名为AKAM。 - 用这样的DataFrame传入
isin()时,pandas只会尝试匹配列名AKAM,自然只会返回对应的数据,而忽略AKRO。
修正方法
你需要明确告诉pandas这个CSV没有表头,把所有行都当作数据读取:
方法1:指定header=None并转为列表/Series
# 转为列表 mikey_symbols = pd.read_csv("symbols.csv", header=None)[0].tolist() # 或者转为Series(isin支持直接传入Series) mikey_symbols = pd.read_csv("symbols.csv", header=None, squeeze=True)
方法2:手动指定列名后提取数据
mikey_symbols = pd.read_csv("symbols.csv", names=['symbol'])['symbol'].tolist()
修正后的完整代码
origin_symbols = pd.read_sql_query("SELECT id, symbol, name from stock", conn) mikey_symbols = pd.read_csv("symbols.csv", header=None, squeeze=True) df = origin_symbols[origin_symbols['symbol'].isin(mikey_symbols)]
此时就能同时匹配到AKAM和AKRO对应的两条数据了。
内容的提问来源于stack exchange,提问作者a7dc
相关产品推荐
相关产品推荐

