今天我正在努力寻找有趣的警告:
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 ? ? ? ? ? ? ? ? ? ? ?
列[1]和列[4]指的是“人类染色体”,应该是1到22,然后是X和Y.
有些文件很短(2k行),有些文件很长(200k行)。
如果我用短文件制作一个pandas.Dataframe,那么没问题,解析器会正确地将列[1]和[4]中的项目识别为'string'。
但是如果文件足够长,解析器会将'int'指定为某个点,然后在遇到'X'或'Y'时立即指定'string'。
此时我收到了警告。
我认为这种情况正在发生,因为解析器在内存中加载了有限数量的行,然后检查要考虑列的所有值的最佳类型,然后继续解析文件的其余部分。
现在,如果可以一次解析所有行,那么没有错误,解析器一次识别所有值[1,2,3,4 ...,'X','Y']和指定最佳类型(在本例中为'str')。 如果行数太大,那么文件将被分解,在我的例子中,第一部分仅包含[1,2,3,4],解析器分配'int'。
这当然搞砸了我的管道......
如何强制解析器仅为列[1]和[4]指定类型'str'?
这是我用来从我的文件中创建Dataframes的代码:
dataset = pandas.io.parsers.read_table(my_file, sep='\t', index_col=0)
答案 0 :(得分:1)
您可以将列的dtypes设置为read_csv
的参数,这样如果您知道列,则只需传递一个以列名作为键的dict,并将dtype作为值传递,例如:
dataset = pandas.io.parsers.read_table(my_file, sep='\t', index_col=0, dtype={'ChrA':'str'})
只需继续向字典添加其他列名称。