繁体   English   中英

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

[英]How to treat NULL as a normal string with pandas?

我有一个带有字符串列的 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 中? 可以假设该文件不包含任何实际缺失的值。

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

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,因此请谨慎使用。 如果您想通过外科手术将其应用于选择列,我建议第一个选项。

发生这种情况的原因是字符串'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_values : 标量、str、类列表或字典,默认无

要识别为 NA/NaN 的其他字符串。 如果 dict 通过,特定的每列 NA 值。 默认情况下,以下值被解释为 NaN:''、'#N/A'、'#N/AN/A'、'#NA'、'-1.#IND'、'-1.#QNAN'、 '-NaN', '-nan', '1.#IND', '1.#QNAN', 'N/A', 'NA', 'NULL', 'NaN', 'n/a', 'nan ', '空值'。

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

非常感谢@aiguofer提供的解决方案:

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)

旧答案:

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

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)

其他答案更适合在 csv 中读取而不会将 "null" 解释为Nan ,但是如果您有一个想要“固定”的数据df=df.fillna('null') ,则此代码将这样做: df=df.fillna('null')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM