【问题标题】:How to force pandas.io.parsers to set column-specific types如何强制 pandas.io.parsers 设置特定于列的类型
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,不清楚如何指定 dtype,除了字典我什么都试过了 :)
  • 唯一的问题是,如果引擎类型是 python,它就不起作用,否则有时预先指定 dtypes 不仅适用于像你这样的情况,而且即使你有一个大的 csv 和这些类型是明确定义的数字类型,因为这将降低速度和内存使用量,因为它不需要猜测 dtype
猜你喜欢
  • 2018-11-29
  • 2018-05-15
  • 2012-03-07
  • 2023-02-02
  • 1970-01-01
  • 2020-03-17
  • 2018-02-20
  • 2021-05-16
  • 2023-01-18
相关资源
最近更新 更多