仅在Jupyter中使用Pandas过滤DataFrame返回空结果的问题
问题描述
我通过以下代码获取了一个DataFrame:
file_path = os.path.join(dataset_path, 'movie_conversations.txt') movie_conversations = pd.read_csv(file_path, sep=r"\+\+\+\$\+\+\+", encoding='cp1251', engine='python', names=['characterID_1', 'characterID_2', 'movieID', 'list_of_the_utterances']) movie_conversations.head()
该代码返回的DataFrame显示正常:
| characterID_1 | characterID_2 | movieID | list_of_the_utterances |
|---|---|---|---|
| u0 | u2 | m0 | ['L194', 'L195', 'L196', 'L197'] |
| u0 | u2 | m0 | ['L198', 'L199'] |
| u0 | u2 | m0 | ['L200', 'L201', 'L202', 'L203'] |
但当我执行如下过滤操作时,返回的是空DataFrame:
movie_conversations[movie_conversations.movieID == "m0"]
此外,执行movie_conversations.movieID == "m0"时,该列所有值的匹配结果均为False:
0 False 1 False 2 False 3 False 4 False ... 83092 False 83093 False 83094 False 83095 False 83096 False Name: movieID, Length: 83097, dtype: bool
该问题仅出现在JupyterLab/Notebook中,在PyCharm/DataSpell中运行则一切正常。
解决办法
清理隐藏空白字符:Jupyter和PyCharm对字符串的显示逻辑不同,看似是
m0的单元格可能包含空格、制表符等隐藏字符。先检查字符串长度确认:movie_conversations['movieID'].apply(len)如果长度大于2,说明存在多余字符,用
str.strip()清理列数据:movie_conversations['movieID'] = movie_conversations['movieID'].str.strip()之后再执行过滤操作即可。
读取时直接处理数据:可以在
pd.read_csv阶段就指定转换器清理movieID列,避免后续问题:movie_conversations = pd.read_csv( file_path, sep=r"\+\+\+\$\+\+\+", encoding='cp1251', engine='python', names=['characterID_1', 'characterID_2', 'movieID', 'list_of_the_utterances'], converters={'movieID': lambda x: x.strip()} )重启Jupyter内核:Jupyter可能存在变量缓存问题,导致新修改不生效。重启内核后重新运行所有代码,排除旧数据干扰。
内容的提问来源于stack exchange,提问作者VladislavFrolov
相关产品推荐
相关产品推荐

