Панды, ошибочно возвращающие TypeError, не могут выполнять индексацию срезов в <class 'pandas.core.indexes.base.Index'> с помощью этих индексаторов [310] из <class 'int'> - PullRequest
0 голосов
/ 30 апреля 2018

У меня действительно странная проблема с пандами - я пытаюсь извлечь столбец значений из кадра данных для последующего анализа. Сценарий, который я написал, перебирает много файлов одновременно, чтобы сделать это. Каждый файл был создан с использованием одной и той же команды на bam-readcounts и содержит данные о глубине чтения для прогона секвенирования ДНК.

Иногда это работает как сон и возвращает все, что мне нужно, чтобы вернуть, другие я получаю сообщение об ошибке:

TypeError: cannot do slice indexing on <class 'pandas.core.indexes.base.Index'> with these indexers [310] of <class 'int'>

Столбец определенно содержит целые числа - я попробовал запустить скрипт с помощью float и str, чтобы быть уверенным.

У меня даже были случаи, когда я анализировал один и тот же набор файлов с интервалом в несколько минут без изменения кода моего сценария, и панды возвращали сообщение об ошибке. У меня были случаи, когда я анализировал два пакета файлов, созданных одновременно с помощью bam-headcount, и заставлял его возвращать сообщение об ошибке в одном пакете, но не в другом.

Соответствующий код:

col_names = ['Col_' + str(i) for i in range(1, max_col_nr)]

df = pd.read_csv(myFile, sep = '\t', names = col_names)
df2 = df.set_index("Col_2", drop = False)
df3 = (df2.loc[310:400,"Col_4"])
US_Av = (int(round(df4.mean())))

У меня никогда не было такой ситуации, когда один и тот же фрагмент кода изменял свое поведение при запуске, и если у кого-то есть какой-либо совет, я был бы чрезвычайно признателен. Это сводит меня с ума.

Пример данных для справки ниже. Это 4-я колонка, по которой я пытаюсь получить среднее значение.

GRIN2A  280 A   169     
GRIN2A  281 C   169 
GRIN2A  282 C   172
GRIN2A  283 T   171 

Ответы [ 2 ]

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

Вы можете явно установить dtypes несколькими способами, что позволит вам избежать операторов if.

Первый - это набор типов при чтении файлов, например:

df = pd.read_csv(myFile,
                 sep = '\t',
                 names = col_names,
                 dtype = {<column name>: np.int32, ...}) # note that you'll need numpy imported

Очевидно, это работает, только если вы заранее знаете, какие типы столбцов. Документация для read_csv содержит больше информации - вы также можете установить только некоторые из столбцов или сказать пандам пропустить интерпретацию для всего файла (что вы хотели бы сделать, если вы попробуете следующие опции ).

Следующая опция - использовать to_numeric, которая будет приводить серию перед тем, как вы сделаете ее индексом. Это, наверное, самый простой способ сделать это.

df = pd.read_csv(myFile, sep = '\t', names = col_names)
df["Col_2"] = pd.to_numeric(df["Col_2"])
df2 = df.set_index("Col_2", drop = False)
df3 = (df2.loc[310:400,"Col_4"])
US_Av = (int(round(df4.mean())))

Затем, наконец, однострочная версия:

df = pd.read_csv(myFile, sep = '\t', names = col_names)
df2 = df.set_index(df.Col_2.as_type(int), drop = False)
df3 = (df2.loc[310:400,"Col_4"])
US_Av = (int(round(df4.mean())))
0 голосов
/ 02 мая 2018

Я думаю, я понял - вы были на правильном пути с dtype. В файлах, которые потерпели неудачу, панды неправильно маркировали столбцы. Правильный результат для pd должен быть

df =
      Col_1  Col_2 Col_3  Col_4  
0    GRIN2A    280     A     44   
1    GRIN2A    281     C     44   
2    GRIN2A    282     C     44 

Для некоторых файлов один и тот же код приводит к

df =
        Col_1 Col_2  Col_3
GRIN2A    280     A     46
GRIN2A    281     A     46
GRIN2A    282     A     46

Это означало, что для файлов, в которых это произошло, индексированный Col_2 был str, а не int, что приводило к сообщению об ошибке.

Я до сих пор не могу понять, почему pandas неправильно размещает столбцы в некоторых файлах, но не в других (2 или 3 на одну итерацию более 300 файлов). Файлы одинаково отформатированы и созданы с помощью одного и того же итератора bam-readcount над моими отсортированными файлами bam.

Код, включающий pandas, также запускается итератором, поэтому он будет одинаковым для каждого файла.

Я могу обойтись, используя что-то вроде ...

if Col2 is (int): 
elif Col1 is (int): 

Немного неуклюже и не решает основную проблему, но, по крайней мере, я не потеряю данные в файлах с ошибочными заголовками. Если у кого-то есть идеи, почему это может происходить, я хотел бы услышать комментарии.

Спасибо за помощь, RCA

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