使用for循环会产生关键错误

时间:2018-06-30 23:12:03

标签: pandas dictionary for-loop keyerror

我有一个名为等位基因的熊猫数据框,如下所示:

         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 :(得分:0)

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