Pandas itertuple возвращает несовместимый тип, либо Pandas, либо кортеж - PullRequest
0 голосов
/ 07 мая 2018

Я получаю странное поведение, которого я никогда раньше не видел в своем коде, который я много раз использовал ранее для небольших наборов данных. Я анализирую VCF-файлы с помощью Pandas dataframe read_table. VCF-файлы имеют заголовок, а затем 9 столбцов + однако много столбцов отдельных лиц. Раньше, когда я использовал for row in genomes_df.itertuples(): для итерации по каждой строке кадра данных, я мог вызывать столбец "SVLEN" с row.SVLEN. Когда я проверяю type(row), это объект Pandas. Сегодня я запустил свой скрипт для файла большего размера (350 столбцов против 10 столбцов ранее) того же формата VCF, он дает мне AttributeError: 'tuple' object has no attribute 'SVLEN', потому что теперь type(row) - это кортеж!

Что здесь происходит? Имена столбцов разные (NWD107911.mark_dupes против NWD107911), но я проверил, что в именах нет пробелов (читайте в другом посте, что это может вызвать другое поведение).

1 Ответ

0 голосов
/ 07 мая 2018

Упоминается в документации 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

Примечание: это ограничение в 255 аргументов для вызова / namedtuples cpython было исправлено в python 3.7 , поэтому потенциально это может быть изменено в будущих версиях панд (работающих на python 3.7 +).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...