使用Pandas与Python对比数据源:重复读取CSV却不匹配的问题排查
为啥两次读取的CSV匹配率不是100%?我帮你捋捋
先给你揪出最直观的问题:你代码里读取的是两个不同路径下的同名文件——02 dump/reputation.csv和00 data/reputation.csv,这俩文件十有八九内容不一样,这绝对是匹配率不达标的首要原因。要是你是不小心写错了路径,先赶紧确认是不是读的同一个文件;要是本来就是要对比这两个文件,那内容有差异太正常了。
假设你确实是想读同一个文件(比如手滑写错路径),那还有这些坑可能踩了:
- 浮点精度的隐形坑:虽然你加了
float_precision='round_trip',但有些特殊浮点数在存进CSV再读出来的过程中,还是会有极其微小的精度损失,肉眼看不出来,但代码对比就是不相等。你可以用pd.testing.assert_frame_equal来对比,它能设置误差容忍度,忽略这种微小差异。 - 行/列顺序乱了:要是两个DataFrame的行排序或者列顺序不一样,你逐行遍历对比肯定对不上啊。比如一个是按ID排序,另一个是按时间排序,那对应位置的行内容自然不同。对比前先按相同的列把两个DataFrame排好序就行。
- 看不见的字符在搞鬼:单元格里可能藏着空格、换行符、制表符这些不可见字符,看起来内容一样,实际字符串完全不同。可以先给所有字符串列做个
str.strip()清理掉多余字符再对比。 - 缺失值解析不一样:
read_csv对空值的处理可能有差异,比如一个文件里的空单元格被解析成NaN,另一个被解析成空字符串,这样对比的时候就会判定不相等。你可以看看两个DataFrame的dtypes和缺失值情况。 - 编码不统一:如果两个文件的编码格式不一样(比如一个是UTF-8,一个是GBK),读出来后某些字符会乱码,字符串对比自然失败。读取的时候统一指定
encoding='utf-8'试试。
给你个实用的排查代码,用pd.testing.assert_frame_equal直接找出差异:
import pandas as pd _new = pd.read_csv('02 dump/reputation.csv', sep=';', float_precision='round_trip') _data = pd.read_csv('00 data/reputation.csv', sep=';', float_precision='round_trip') try: # 设置误差容忍度,忽略微小浮点差异 pd.testing.assert_frame_equal(_new, _data, rtol=1e-9, atol=1e-9) print("两个数据集完全一致!") except AssertionError as e: print("找到差异啦:", e)
要是你本来就是要对比两个不同路径的文件,用这段代码能直接输出差异行,方便定位问题:
# 合并两个数据集,标记差异行 diff_df = pd.merge(_new, _data, how='outer', indicator=True) # 筛选出只在一个数据集中出现的行 diff_rows = diff_df[diff_df['_merge'] != 'both'] print("差异的具体内容:") print(diff_rows)
内容的提问来源于stack exchange,提问作者NRD
相关产品推荐
相关产品推荐

