防止Pandas将字符串中的“NA”解释为NaN

mwg9r5ms  于 2022-11-05  发布在  其他
关注(0)|答案(6)|浏览(199)

pandas read_csv()方法将'NA'解释为nan(不是数字),而不是有效的字符串。
在下面的简单情况中,请注意第1行第2列(基于零的计数)中的输出是“nan”而不是“NA”。

示例.tsv(制表符分隔)

PDB链SP_主资源_请求资源_结束PDB_请求PDB_结束SP_请求SP_结束
5d8b编号P60490 1 146 1 146 1 146
5d8b不适用P80377 1 126 1 126
5d8b O P60491 1 118 1 118 1 118 1 118

读取样本.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,u '5d8b',u 'N',u 'P60490',1,146,1,146,1,146)
(1,u '5d8b',南,u 'P80377',第126页,第126页,第126页)
(2,u“5d8b”,u“O”,u“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记录数组来解析文件,但是考虑到现在指定列数据类型的能力,这应该是没有必要的。
注意itertuples()用于保存数据类型,如iterrows文档中所述:“为了在遍历行时保留数据类型,最好使用itertuples(),它返回值的元组,通常比iterrows快.”
我们在Python 2和Python 3上使用panda 0.16.2、0.17.0和0.17.1版本对示例进行了测试。
有没有办法捕获一个有效的字符串'NA',而不是将其转换为nan?

jogvjijk

jogvjijk1#

您可以使用参数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值的所有默认NA值(从pandas 1.0.0开始):
默认的NaN可识别值为[“-1.#IND”、“1.#QNAN”、“1.#IND”、“-1.#QNAN”、"#N/A"、"#N/A"、"N/A"、“n/a”、“NA "、”“、”#NA“、”NULL“、”null“、”NaN"、“-NaN”、“nan”、“-nan”、“”]。

5ktev3wc

5ktev3wc2#

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

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

b1payxdu3#

设置keep_default_na参数就可以了。
下面是一个使用Pandas阅读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

参考:

o75abkj4

o75abkj44#

这种方法对我很管用:

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
w51jfk4q

w51jfk4q5#

使用panda阅读文件时,可以在该行中使用参数na_filter = Falsekeep_default_na=False

import pandas as pd

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

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

yduiuuwa6#

基于Anton Protopopovanswer,一种最小化修改默认值的简洁方法(即删除不想解析为NaN的值,并添加那些想解析为NaN的值):

from pandas._libs.parsers import STR_NA_VALUES

accepted_na_values = STR_NA_VALUES - {'NA'} | {'_'}
path = 'myexcel.xlsx'
df = pd.read_excel(path, keep_default_na=False, na_values=accepted_na_values)

相关问题