防止大熊猫将“ NA”解释为字符串中的 NaN

熊猫 Read _ csv ()方法将‘ NA’解释为 nan (而不是数字) ,而不是一个有效的字符串。

在下面的简单示例中,请注意第1行中的输出,第2列(从零开始计数)是“ nan”而不是“ NA”。

Tsv (以 tab 分隔)

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 P80377112611261126
5d8b O P60491111811181118 < br >

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,u’5d8b’,u’N’,u’P60490’,1,146,1,146,1,146)
(1, u'5d8b', nan, u'P80377', 1, 126, 1, 126, 1, 126)
(2,u’5d8b’,u‘ O’,u‘ P60491’,1,118,1,118,1,118) < br >

Additional Information

Re-writing the file with quotes for data in the 'CHAIN' column and then using the quotechar parameter quotechar='\'' has the same result. And passing a dictionary of types via the dtype parameter dtype=dict(valid_cols) does not change the result.

对于 Prevent pandas from automatically inferring type in read_csv的一个老的回答是,建议首先使用一个数字记录数组来解析文件,但是考虑到现在可以指定列 dtype,这应该没有必要。

请注意,itertuples ()用于保留在 iterrows 文档中描述的 dtype: “为了在对行进行迭代时保留 dtype,最好使用 itertuples () ,它返回值的元组,并且作为 iterrows 通常更快。”

Example was tested on Python 2 and 3 with pandas version 0.16.2, 0.17.0, and 0.17.1.


有没有一种方法可以捕获一个有效的字符串‘ NA’,而不是将其转换为 nan?

68638 次浏览

可以使用参数 keep_default_nana_values手动设置所有 NA 值 医生:

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值(从 pandas1.0.0开始) :

缺省 NaN 识别值为[’-1。# IND’,’1。# QNAN’,’1。# IND’,’-1。# QNAN’,’# N/A N/A’,’# N/A’,’N/A’,’n/a’,’NA’,’# NA’,‘ NULL’,‘ NULL’,‘ NaN’,’-NaN’,‘ NaN’,’-NaN’,”]。

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

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

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

下面是一个使用熊猫读取 CSV 文件时保持 NA为字符串值的例子。

data.csv:

country_name,country_code
Mexico,MX
Namibia,NA

返回文章页面

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

参考文献:

这种方法对我很有效:

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,然后注释出 NA,我希望这个列表被解释为不是 NaN。这种方法仍然将其他值视为 NaN,但 NA 除外。

 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

在使用熊猫读取文件时,可以在该行中使用参数 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)

安东 · 普罗托波夫回答为基础,一种简洁的方法来最小限度地修改默认值(即删除不想解析为 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)