先把当时的情况摆出来。用 pandas 2.2 的 read_csv 读产品表,型号列里 NA-01 和 NA-02 全被读成 NaN,按型号聚合时这两类直接消失。加 keep_default_na=False 之后空字符串又变成合法型号,试过 na_values=[''] 结果一样,源文件里这两个型号各有 600 行。

原因不止一个,得分开看。pandas 默认把 NA、N/A、NaN 这些串当成缺失标记。另一种情况是关掉默认缺失标记之后空串需要另行处理。

另外,型号列被自动推断成了非字符串类型。少数情况下是下游聚合用 dropna,把真实型号一起删掉了。

先看默认读进来这几行是什么值

python -c "import pandas as pd;df=pd.read_csv('p.csv');print(df[df['model'].isna()].head())"

接着关掉默认缺失标记再读一次

python -c "import pandas as pd;df=pd.read_csv('p.csv',keep_default_na=False);print(df['model'].value_counts().head())"

显式声明列类型与缺省值

python -c "import pandas as pd;df=pd.read_csv('p.csv',dtype={'model':str},keep_default_na=False,na_values=['']);print(df['model'].head())"

等前面都确认过,再核对两个型号的行数是否对上

python -c "import pandas as pd;df=pd.read_csv('p.csv',keep_default_na=False);print((df['model']=='NA-01').sum())"

恢复的判定其实很直接。NA-01 与 NA-02 各 600 行完整读出,空值行数为 0,按型号聚合的结果与源表一致。

NA 既是缺失标记也是合法词,读表前先看一眼取值域,产品型号、国家代码这类列最容易被默认规则吃掉。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189