Использование цикла for приводит к ошибке ключа - PullRequest
0 голосов
/ 01 июля 2018

У меня есть pandas dataframe под названием alleles , который выглядит следующим образом:

         0    1    2    3    4    5    6    7    8    9 
40011    0    0    0    0    0    0    0    0    0    0
40012    0    0    0    0    0    0    0    0    0    0
40013    0    0    0    0    1    0    0    0    0    0
40014    0    0    0    0    0    0    0    0    0    0   

И я хотел бы отобразить значение вместо всех 1.

alleles[0] = alleles[0].map({'1' : 20, '0': 0})

Выполнение вышеуказанного успешно заменяет все значения для указанного столбца.

for i in alleles:
    alleles[i] = alleles[i].map({'1' : Merged_transpose[1][0], '0': 0})

Но выполнение цикла for, как показано выше, приводит к:

KeyError: 1

1 Ответ

0 голосов
/ 01 июля 2018
data = {40011 : [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],                  
        40012 : [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],                  
        40013 : [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],                  
        40014 : [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}        

alleles = pd.DataFrame.from_dict(data, orient='index')

In [333]: alleles
Out[333]: 
       0  1  2  3  4  5  6  7  8  9
40011  0  0  0  0  0  0  0  0  0  0
40012  0  0  0  0  0  0  0  0  0  0
40013  0  0  0  0  1  0  0  0  0  0
40014  0  0  0  0  0  0  0  0  0  0

Вы указали, что ваше отображение одного индекса работает, но ...

alleles[0] = alleles[0].map({'1' : 20, '0': 0})

In [335]: alleles
Out[335]: 
        0  1  2  3  4  5  6  7  8  9
40011 NaN  0  0  0  0  0  0  0  0  0
40012 NaN  0  0  0  0  0  0  0  0  0
40013 NaN  0  0  0  1  0  0  0  0  0
40014 NaN  0  0  0  0  0  0  0  0  0

Похоже, что вы сопоставляете str, а не int, содержащийся в кадре данных. Если вы измените отображение, результат будет более соответствовать желаемому результату. (сбросить фрейм данных)

alleles[0] = alleles[0].map({1 : 20, 0: 0})  #<-- note: no quotes around 1 or 0
alleles[4] = alleles[4].map({1 : 20, 0: 0})  #<-- note: no quotes around 1 or 0

In [340]: alleles
Out[340]: 
       0  1  2  3   4  5  6  7  8  9
40011  0  0  0  0   0  0  0  0  0  0
40012  0  0  0  0   0  0  0  0  0  0
40013  0  0  0  0  20  0  0  0  0  0
40014  0  0  0  0   0  0  0  0  0  0

Теперь, если мы применим это изменение отображения к вашему for loop, мы получим (сбросить фрейм данных):

for i in alleles:
    alleles[i] = alleles[i].map({1 : 20, 0: 0})

In [344]: alleles
Out[344]: 
       0  1  2  3   4  5  6  7  8  9
40011  0  0  0  0   0  0  0  0  0  0
40012  0  0  0  0   0  0  0  0  0  0
40013  0  0  0  0  20  0  0  0  0  0
40014  0  0  0  0   0  0  0  0  0  0

Единственный открытый вопрос тогда будет, если ваша Merged_transpose[1][0] является проблемой - но нет способа узнать, не зная, что это такое и что он делает ...

обновление

После еще одной путаницы - ваша проблема связана с объектом Merged_transpose и, скорее всего, с первым индексом вашего прохождения. После исправления словаря сопоставления он не проходит через KeyError: 1 независимо.

...