熊猫的read_csv()方法将’NA’解释为nan(不是数字),而不是有效的字符串。
在下面的简单情况下,请注意,第1行第2列(基于零的计数)的输出为’nan’而不是’NA’。
sample.tsv (制表符分隔)
PDB链SP_PRIMARY RES_BEG RES_END PDB_BEG PDB_END SP_BEG SP_END
5d8b N P60490 1146 1146 1146
5d8b NA P80377 1 126
1126 1126 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,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)
用’CHAIN’列中的数据引号重写文件,然后使用quotechar参数quotechar='\''
具有相同的结果。并且通过dtype参数传递类型的字典dtype=dict(valid_cols)
不会更改结果。
请注意,按照iterrows文档中的描述,itertuples()用于保留dtype:“要在迭代行时保留dtype,最好使用itertuples()返回值的元组,并且通常在迭代时更快。”
该示例已在Python 2和3上使用pandas版本0.16.2、0.17.0和0.17.1进行了测试。
有没有办法捕获有效的字符串“ NA”,而不是将其转换为nan?
您可以使用参数keep_default_na
和na_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值中的所有默认NA
值(自1.0.0起):pandas
NaN识别的默认值是[‘-1。#IND’,‘1.#QNAN’,‘1.#IND’,’-1.#QNAN’,’#N / AN / A’,’#N / A’,’N
/ A’,’n / a’,’NA’,’,’#NA’,’NULL’,’null’,’NaN’,’-NaN’,’nan’,’- nan’,’‘]。
问题内容: 我有一个带有ID号的大型数据框: 这些现在都是字符串。 我想转换为不使用循环-为此我使用。 问题是我的某些行包含无法转换为的脏数据,例如 如何(不使用循环)删除这些类型的事件,以便我可以放心使用? 问题答案: 您需要向功能添加参数: 如果是列: 但非数字会转换为,因此所有值都是。 对于需要转换到一些值,例如,然后转换为: 样品: 编辑:如果使用0.25+大熊猫,则可以使用:
问题内容: 我正在分析一个时间序列,并基于某些条件,我可以挑选出事件 开始 或 结束 的行。此时,我的系列看起来像这样(为简洁起见,我省略了一些重复的值): 设置 这是我想要实现的( 理想情况下没有循环) 这是我尝试过的 通过对数据质量的一些乐观假设,我可以获得如下 事件编号 : 然后,我可以将其恢复到原始数据框,并使用 问题 如您所见,事件之间的时间(01:20到02:20)与事件#1相关联。
我有这个“file.csv”文件要和熊猫一起读: 使用 输出为: 我知道,列是一个完整的字符串,因为: 我需要将其作为字符串列表来阅读,如。我尝试了这个问题中提供的解决方案,但没有成功,因为我的和字符实际上会把事情搞砸。 预期输出应为:
问题内容: 我想替换列中的子字符串 到。 需求输出 我尝试,但它返回。 问题答案: 使用与更换和:
问题内容: 如问题所述,我有一个很大的数据框,但看起来像: 我试图摆脱文本数据,并将其替换为预定义的数值等效项。例如,在这种情况下,我想分别用或替换的或值。有没有一种方法无需我手动输入和更改值? 问题答案: / 上面的一个有趣的通用版本: 一切都不是。
问题内容: 我有一个包含字母数字键的数据框,我想另存为csv并在以后读取。由于种种原因,我需要以字符串格式显式读取此键列,所以我使用的键严格地是数字的,甚至更糟,例如:1234E5,Pandas会将其解释为浮点数。这显然使密钥完全无用。 问题是,当我为数据框或其中的任何列指定字符串dtype时,我只会得到垃圾回收。我在这里有一些示例代码: 数据框如下所示: 然后我像这样阅读: 结果是: 这是我的计