如何将NULL视为带有pandas的普通字符串?

时间:2018-06-04 15:15:04

标签: python string pandas csv dataframe

我有一个带有字符串的列的csv文件,我想用pandas读取它。在此文件中,字符串null作为实际值出现,不应被视为缺失值。

示例:

import pandas as pd
from io import StringIO

data = u'strings,numbers\nfoo,1\nbar,2\nnull,3'
print(pd.read_csv(StringIO(data)))

这给出了以下输出:

  strings  numbers
0     foo        1
1     bar        2
2     NaN        3

如何将值null原样(而非NaN)添加到DataFrame中?可以假定该文件不包含任何实际缺失的值。

4 个答案:

答案 0 :(得分:29)

您可以为converters列指定string参数。

pd.read_csv(StringIO(data), converters={'strings' : str})

  strings  numbers
0     foo        1
1     bar        2
2    null        3

这将绕过大熊猫的自动解析。

另一个选择是设置na_filter=False

pd.read_csv(StringIO(data), na_filter=False)

  strings  numbers
0     foo        1
1     bar        2
2    null        3

这适用于整个DataFrame,因此请谨慎使用。如果您想通过手术将其应用于选择列,我建议使用第一个选项。

答案 1 :(得分:15)

发生这种情况的原因是字符串'null'在解析时被视为NaN,您可以通过传递keep_default_na=False以及@ coldspeed的答案来关闭它:

In[49]:
data = u'strings,numbers\nfoo,1\nbar,2\nnull,3'
df = pd.read_csv(io.StringIO(data), keep_default_na=False)
df

Out[49]: 
  strings  numbers
0     foo        1
1     bar        2
2    null        3

完整清单是:

  

na_values:标量,str,类似列表或dict,默认无

     

要识别为NA / NaN的其他字符串。如果dict通过,具体   每列NA值。默认情况下,将解释以下值   作为NaN:'','#N / A','#N / A N / A','#N',' - 1。#IND',' - 1。#QNAN',' - 'N',   '-nan','1。#IND','1。#QNAN','N / A','NA','NULL','NaN','n / a','nan',   “NULL”。

答案 2 :(得分:5)

我们可以从默认'NULL'集合中动态排除'null'_NA_VALUES

In [4]: na_vals = pd.io.common._NA_VALUES.difference({'NULL','null'})

In [5]: na_vals
Out[5]:
{'',
 '#N/A',
 '#N/A N/A',
 '#NA',
 '-1.#IND',
 '-1.#QNAN',
 '-NaN',
 '-nan',
 '1.#IND',
 '1.#QNAN',
 'N/A',
 'NA',
 'NaN',
 'n/a',
 'nan'}

并在read_csv()中使用它:

df = pd.read_csv(io.StringIO(data), na_values=na_vals)

答案 3 :(得分:2)

其他答案更适合在没有" null"的情况下阅读csv。被解释为Nan,但是如果你有一个你想要的数据框"已修复",则此代码将执行此操作:df=df.fillna('null')