pandas read_csv()方法解释了' NA'作为nan(不是数字)而不是有效的字符串。
在下面的简单情况中,请注意第1行第2列(基于零的计数)中的输出是' nan'而不是' NA'。
sample.tsv (制表符分隔)
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 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'而不是将其转换为纳米?
答案 0 :(得分:30)
您可以使用参数keep_default_na
和na_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