Python 如何使用pandas将NULL视为正常字符串?

Python 如何使用pandas将NULL视为正常字符串?,python,string,pandas,csv,dataframe,Python,String,Pandas,Csv,Dataframe,我有一个带有字符串的列的csv文件,我想用熊猫读取它。在此文件中,字符串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

我有一个带有字符串的列的csv文件,我想用熊猫读取它。在此文件中,字符串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?可以假定该文件不包含任何实际缺少的值。

您可以为字符串列指定一个转换器参数

这将绕过熊猫的自动解析

另一个选项是设置na_filter=False:


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

发生这种情况的原因是字符串“null”在解析时被视为NaN,除了@coldspeed的答案外,您还可以通过传递keep_default_na=False来关闭此选项:

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_值:标量、str、类似列表或dict,默认为无

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

更新:2020-03-23熊猫1+:

非常感谢您提供了经过调整的解决方案:

na_vals = pd.io.parsers.STR_NA_VALUES.difference({'NULL','null'})
df = pd.read_csv(io.StringIO(data), na_values=na_vals, keep_default_na=False)
旧答案:

我们可以从默认值集中动态排除“NULL”和“NULL”:

并在read_csv中使用它:


其他答案对于在csv中读取而不将null解释为Nan更好,但是如果您有一个需要修复的数据帧,则此代码将这样做:df=df.fillna'null'

无法重现该问题。它将null作为字符串提供给我。@HarvIpan当我运行他们的代码时,它将如OP所说的那样提供NaN。。。hmm@coldspeed有趣的我不知道我做错了什么。不管怎样,你的回答很好~+1.我将pandas 0.23.0与python 3.5.2结合使用,如果这有帮助的话…@coldspeed,仅供参考,我已将DUP反转,这个问题现在是我的目标。同样的问题,但这里的答案现在可能更好。有趣的是,他们有多个参数来做完全相同的事情…@coldspeed是的,事实上你有不同的副作用取决于na_值是否被指定,这进一步使事情复杂化了!这几乎是可行的,但是您还需要保持_default_na=False,现在默认值在pd.io.parsers.STR_na中_VALUES@aiguofer,非常感谢您指出这一点!我相应地改变了答案
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_vals = pd.io.parsers.STR_NA_VALUES.difference({'NULL','null'})
df = pd.read_csv(io.StringIO(data), na_values=na_vals, keep_default_na=False)
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'}
df = pd.read_csv(io.StringIO(data), na_values=na_vals)