2

我从之前在较小数据集上多次使用过的代码中遇到了一种从未见过的奇怪行为。我正在使用 Pandas 数据帧 read_table 解析 VCF 文件。VCF 文件有一个标题,然后是 9 列 + 多列个人。在我以前for row in genomes_df.itertuples():遍历数据帧的每一行之前,我可以用row.SVLEN. 当我检查type(row)它是一个熊猫对象时。今天我在相同 VCF 格式的更大文件(350 列 vs 之前 10 列)上运行我的脚本,它给了我AttributeError: 'tuple' object has no attribute 'SVLEN',因为现在type(row)是一个元组!

这里发生了什么?列名不同(NWD107911.mark_dupesvs NWD107911),但我检查了名称中没有空格(在另一篇文章中阅读它可能导致不同的行为)。

4

1 回答 1

4

它在iterttuples文档中提到:

对于大量列 (>255),将返回常规元组。

您可以在此处的源代码中看到:

        # Python 3 supports at most 255 arguments to constructor, and
        # things get slow with this many fields in Python 2
        if name is not None and len(self.columns) + index < 256:
            # `rename` is unsupported in Python 2.6
            try:
                itertuple = collections.namedtuple(name,
                                                   fields + list(self.columns),
                                                   rename=True)
                return map(itertuple._make, zip(*arrays))
            except Exception:
                pass

注意:cpython 调用/namedtuples 的 255 个参数的限制已在 python 3.7 中修复,因此可能会在未来版本的 pandas 中更改(在 python 3.7+ 上运行)。

于 2018-05-07T02:55:05.290 回答