2014-10-22 2 views
2

Итак, я попытался запустить код, который я разработал ранее, который много раз выполнял использование pandas.Глюч в Пандах? Невозможно перезаписать значение

У моей DataFrame есть собственный индекс (с уникальными строковыми значениями как индекс, представляющий уникальный идентификатор, в данном случае отдельные белки) и имена файлов в качестве столбцов. Затем я использую итеративную процедуру для присвоения подсчетов некоторым ячейкам в фрейме данных. Итак, допустим, у меня есть словарь по умолчанию (my_dict) с заданным abritrary ключом, а значение - [filename, protein, count].

У меня есть отсортированный список имен файлов и отсортированный список белков, называемый all_filenames и all_proteins, соответственно.

import pandas as pd 
df = pd.DataFrame(index=all_proteins, columns=all_filenames) 

from collections import defaultdict 
my_dict = defaultdict(list) 

... (Assign values to the dictionary) 

for key in my_dict: 
    my_filename = my_dict[key][0] 
    my_protein = my_dict[key][1] 
    my_count = my_dict[key][2] 

    df[my_filename][my_protein] = my_count 

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

Так, чтобы проверить, я следующий на dataframe:

>>> my_filename in df.columns.tolist() 
True 
>>> my_protein in df.index.tolist() 
True 
>>> df[my_filename][my_protein] 
nan 
>>> my_count 
3.0 
>>> type(my_count) 
<type 'numpy.float64'> 
>>> 
>>> df[my_filename][my_protein] = my_count 
>>> df[my_filename][my_protein] 
nan 
>>> 

Я попытался ДФ [my_filename] .ix [my_protein] Д.Ф. [my_filename] .loc [my_protein], и даже создание пользовательский индекс.

Обычно этот сценарий отлично работает. Мои имена файлов обычно бывают примерно такими: beta_maxi070214_08, поэтому нет пробелов или символов ASCII.

Мои имена белков являются стандартными, все имена либо находятся в базе данных UniProtKB, либо являются связями между двумя белками (например, ACACA-ACACB).

Я не уверен, что происходит. У кого-нибудь есть предложения?

EDIT: Вот пример:

>>> my_filename 
'beta_orbi080714_05' 
>>> my_protein 
'ACACA:K1316-ACACA:K1363' 
>>> my_count 
3.0 
>>> type(my_count) 
<type 'numpy.float64'> 
>>> df[my_filename][my_protein] = my_count 
>>> df[my_filename][my_protein] 
nan 
>>> 
+0

Что такое my_column? Это код psuedo или точный код, который вы используете? Где определяется my_column? – Parker

+0

Итак, я в основном импортирую список файлов и извлекаю имена файлов из файлов. В этом случае я протестировал его с файлом, который, как я знал, был в списке. Например, 'beta_maxi070214_08' - это строка и имя файла и является компонентом списка all_filenames (а также в столбце). –

+0

Вы не ответили, что такое my_column? Где это определено? – Parker

ответ

3

Try: df.ix[my_filename,my_protein] = value

Причина этого (из моего понимания) является то, что ДФ [ 'х'] [ 'у'] возвращает копию фрейма данных. Таким образом, вы меняете значение, но вы меняете значение копии, которое не помещается обратно в нее.

Редактировать: примечания DSM, .loc и .iloc, как правило, предпочтительнее .ix, который имеет трудно объясняемую семантику. И есть раздел документов, посвященных объяснению вопросов, связанных с просмотром или копией. http://pandas.pydata.org/pandas-docs/stable/indexing.html#returning-a-view-versus-a-copy

+0

Вы правы, и это было правильно в теле, и я грубо копировал и вставлял (извините, я попытался отредактировать его перед публикацией). Этот список генерируется анализатором, а затем добавляется в список (сгенерированный кодом, который я использую). Я напечатал список в файл во время отладки, и он работает хорошо. –

+0

обновленный ответ. – Parker

+0

Большое вам спасибо! Сейчас это работает. Я все еще смущен, почему, но по крайней мере теперь у меня может быть действующий код в целом. –

Смежные вопросы