当NA为有效值时检测CSV文件截断

时间:2018-07-31 13:07:05

标签: python pandas

如果我使用Pandas read_csv()函数,则默认情况下短行元素将映射到NaN。我想在将NA解释为NaN时取消该映射。由于传输问题,我对文件截断最感兴趣,但是文件中间的短行应具有相同的missing"值。我尝试弄乱na_filter=Falsekeep_default_na=False,虽然每个似乎都将空单元格映射到空字符串,但都没有将字符串NA映射到NaN

有没有办法让我的蛋糕(NA => NaN)也可以吃掉(缺少未映射到NaN的值)? (我正在使用Pandas 0.22.0 w/ Python 3.6.

示例:

col1,col2,col3,col4
1,2,NA,4
4,5
12

假设文件已被截断,因此字符"12"是文件中的最后一个字符(无EOF)。将na_filterkeep_default_na的默认值设为True,结果是

1,2,NaN,4
4,5,NaN,NaN
12,NaN,NaN,NaN

如果我将任一设置为False,我都会得到

1,2,NA,4
4,5,,
12,,,

我想找到一种从第一行的第三列中取出NaN的方法,同时也不会将丢失的值映射到NaN

1 个答案:

答案 0 :(得分:1)

默认情况下,Pandas会将以下值解释为NaN(来自docs):

  

NaN可以识别的默认值为['-1.#IND', '1.#QNAN', '1.#IND', '-1.#QNAN', '#N/A N/A', '#N/A', 'N/A', 'n/a', 'NA', '#NA', 'NULL', 'null', 'NaN', '-NaN', 'nan', '-nan', '']

为了避免将NA解析为空值,您需要设置keep_default_na=False并直接指定na_values

要解决第二个问题,为了避免Pandas在读取具有可变列数的文件时抛出错误,您需要指定列名。全部放在一起:

# new null values, removing NA from the list
new_na_values = ['-1.#IND', '1.#QNAN', '1.#IND', '-1.#QNAN', '#N/A N/A', '#N/A', 'N/A', 'n/a', '#NA', 'NULL', 'null', 'NaN', '-NaN', 'nan', '-nan', '']

# read in the file
df = pd.read_csv("<path to file>.csv", keep_default_na=False, na_values=new_na_values, names=["col1", "col2", "col3", "col4"])

编辑:看起来最新版本的Pandas现在可以读取具有可变列数的文件,而无需显式设置列名(例如,建议使用here)。因此,根据您的Pandas版本,您可能不需要names参数。