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

How to force pandas.io.parsers to set column-specific types

今天我正在为一个有趣的警告而苦苦挣扎:

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] 指的是 "Human Chromosomes" 并且应该是 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'.

这当然会打乱我的管道..

如何强制解析器仅将类型 'str' 分配给列 [1] 和 [4]?

这是我用来从我的文件中制作 Dataframes 的代码:

dataset = pandas.io.parsers.read_table(my_file, sep='\t', index_col=0)

您可以将列的数据类型设置为 read_csv 的参数,因此如果您知道这些列,则只需传递一个以列名作为键、数据类型作为值的字典,例如:

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

继续向字典中添加额外的列名。