如何强制 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'})
继续向字典中添加额外的列名。
今天我正在为一个有趣的警告而苦苦挣扎:
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'})
继续向字典中添加额外的列名。