【发布时间】:2015-02-09 23:20:25
【问题描述】:
今天我正在努力解决一个有趣的警告:
parsers.py:1139: DtypeWarning: Columns (1,4) have mixed types. Specify dtype option on import or set low_memory=False.
让我们从头开始,我有几个文件,每个文件有数千行,每个文件的内容如下所示:
##ID ChrA StartA EndA ChrB StartB EndB CnvType Orientation GeneA StrandA LastExonA TotalExonsA PhaseA GeneB StrandB LastExonB TotalExonsB PhaseB InFrame InPhase
nsv871164 1 8373207 8373207 1 8436802 8436802 DELETION HT ? ? ? ? ? RERE - 14 24 0 Not in Frame
dgv1n68 1 16765770 16765770 1 16936692 16936692 DELETION HT ? ? ? ? ? NBPF1 - 2 29 -1 Not in Frame
nsv9213 1 16777016 16777016 1 16779533 16779533 DELETION HT NECAP2 + 6 8 0 NECAP2 + 6 8 1 In Frame Not in Phase
.....
nsv510572 Y 16898737 16898737 Y 16904738 16904738 DELETION HT NLGN4Y + 4 6 1 NLGN4Y + 3 6 1 In Frame In Phase
nsv10042 Y 59192042 59192042 Y 59196197 59196197 DELETION HT ? ? ? ? ? ? ? ? ? ? ?
column[1] 和 column[4] 指的是“人类染色体”,应该是 1 到 22,然后是 X 和 Y。
有些文件很短(2k 行)有些很长(200k 行)。
如果我用一个短文件制作 pandas.Dataframe,那么没问题,解析器将列 [1] 和 [4] 中的项目正确识别为“字符串”。
但如果文件足够长,解析器会分配“int”直到某个点,然后在遇到“X”或“Y”时立即分配“字符串”。
此时我收到了警告。
我认为这是因为解析器在内存中加载了有限数量的行,然后考虑到列的所有值检查要分配的最佳类型,然后继续解析文件的其余部分。
现在,如果可以一次解析所有行,那么没有错误,解析器会同时识别所有值 [1,2,3,4...,'X','Y'] 和分配最佳类型(在本例中为“str”)。 如果行数太大,则文件被分段解析,在我的情况下,第一段仅包含 [1,2,3,4] 并且解析器分配'int'。
这当然会打乱我的管道..
如何强制解析器仅将“str”类型分配给列 [1] 和 [4]?
这是我用来从我的文件中生成数据框的代码:
dataset = pandas.io.parsers.read_table(my_file, sep='\t', index_col=0)
【问题讨论】:
-
如果您知道哪些列具有混合类型,那么您可以将列的字典和所需的 dtype 作为参数传递给
read_csvdtype={'ChrA':'str',...} -
好人!谢谢,它按我的意愿工作。
标签: python parsing types pandas dataframe