防止大熊猫解释' NA'字符串

时间:2015-11-27 07:20:05

标签: python pandas

pandas read_csv()方法解释了' NA'作为nan(不是数字)而不是有效的字符串。

在下面的简单情况中,请注意第1行第2列(基于零的计数)中的输出是' nan'而不是' NA'。

sample.tsv (制表符分隔)

  

PDB CHAIN SP_PRIMARY RES_BEG RES_END PDB_BEG PDB_EN​​D SP_BEG SP_END
  5d8b N P60490 1 146 1 146 1 146
  5d8b NA P80377 1 126 1 126 1 126
  5d8b O P60491 1 118 1 118 1 118

read_sample.py

import pandas as pd

df = pd.read_csv(
    'sample.tsv',
    sep='\t',
    encoding='utf-8',
)

for df_tuples in df.itertuples(index=True):
    print(df_tuples)

输出

  

(0,你' 5d8b',你' N',你' P60490',1,146,1,146,1,146)
  (1,你' 5d8b',nan,u' P80377',1,126,1,126,1,126)
  (2,你' 5d8b',你',你' P60491',1,118,1,118,1,118)

其他信息

在' CHAIN'中重写带有数据引号的文件。列然后使用quotechar参数quotechar='\''具有相同的结果。通过dtype参数dtype=dict(valid_cols)传递类型字典不会改变结果。

Prevent pandas from automatically inferring type in read_csv的旧答案建议首先使用numpy记录数组来解析文件,但是现在可以指定列dtypes,这不是必需的。

请注意,itertuples()用于保存derpes,如iterrows文档中所述:"要在迭代行时保留dtypes,最好使用itertuples()返回值的元组,这是通常比它更快。"

使用pandas版本0.16.2,0.17.0和0.17.1在Python 2和3上测试了示例。

有没有办法捕获有效的字符串' NA'而不是将其转换为纳米?

4 个答案:

答案 0 :(得分:30)

您可以使用参数keep_default_nana_values手动设置所有NA值docs

import pandas as pd
from io import StringIO

data = """
PDB CHAIN SP_PRIMARY RES_BEG RES_END PDB_BEG PDB_END SP_BEG SP_END
5d8b N P60490 1 146 1 146 1 146
5d8b NA P80377 _ 126 1 126 1 126
5d8b O P60491 1 118 1 118 1 118
"""

df = pd.read_csv(StringIO(data), sep=' ', keep_default_na=False, na_values=['_'])

In [130]: df
Out[130]:
    PDB CHAIN SP_PRIMARY  RES_BEG  RES_END  PDB_BEG  PDB_END  SP_BEG  SP_END
0  5d8b     N     P60490        1      146        1      146       1     146
1  5d8b    NA     P80377      NaN      126        1      126       1     126
2  5d8b     O     P60491        1      118        1      118       1     118

In [144]: df.CHAIN.apply(type)
Out[144]:
0    <class 'str'>
1    <class 'str'>
2    <class 'str'>
Name: CHAIN, dtype: object

修改

来自na-values的所有默认NA值:

  

默认的NaN识别值为['-1.#IND', '1.#QNAN', '1.#IND', '-1.#QNAN', '#N/A','N/A', 'NA', '#NA', 'NULL', 'NaN', '-NaN', 'nan', '-nan']。虽然是一个长度为0的字符串&#39;&#39;如果未包含在默认的NaN值列表中,它仍会被视为缺失值。

答案 1 :(得分:23)

对我而言,解决方案来自使用参数na_filter = False

df = pd.read_csv(file_, header=0, dtype=object, na_filter = False)

答案 2 :(得分:0)

设置keep_default_na参数可以解决问题。

这里是在使用熊猫读取CSV文件时将NA保留为字符串值的示例。

data.csv

country_name,country_code
Mexico,MX
Namibia,NA

read_data.py

import pandas as pd
data = pd.read_csv("data.csv", keep_default_na=False)
print(data.describe())
print(data)

输出:

       country_name country_code
count             2            2
unique            2            2
top         Namibia           MX
freq              1            1

  country_name country_code
0       Mexico           MX
1      Namibia           NA

参考:

答案 3 :(得分:0)

这种方法对我有用:

import pandas as pd
df = pd.read_csv('Test.csv')
co1 col2  col3  col4

a   b    c  d   e
NaN NaN NaN NaN NaN
2   3   4   5   NaN

我复制了该值并创建了一个列表,默认情况下将其解释为 NaN,然后​​注释掉我想解释为非 NaN 的 NA。这种方法仍然将除 NA 之外的其他值视为 NaN。

 na_values = ["", 
             "#N/A", 
             "#N/A N/A", 
             "#NA", 
             "-1.#IND", 
             "-1.#QNAN", 
             "-NaN", 
             "-nan", 
             "1.#IND", 
             "1.#QNAN", 
             "<NA>", 
             "N/A", 
#              "NA", 
             "NULL", 
             "NaN", 
             "n/a", 
             "nan", 
             "null"]

df1 = pd.read_csv('Test.csv',na_values=na_values,keep_default_na=False )

      co1  col2  col3  col4
a     b     c     d     e
NaN  NA   NaN    NA   NaN
2     3     4     5   NaN