如何强制pandas.io.parsers设置列特定类型

时间:2015-02-09 15:04:53

标签: python parsing types pandas dataframe

今天我正在努力寻找有趣的警告:

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)

1 个答案:

答案 0 :(得分:1)

您可以将列的dtypes设置为read_csv的参数,这样如果您知道列,则只需传递一个以列名作为键的dict,并将dtype作为值传递,例如:

dataset = pandas.io.parsers.read_table(my_file, sep='\t', index_col=0, dtype={'ChrA':'str'})

只需继续向字典添加其他列名称。