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

Using a for loop produces a key error

我有一个名为 alleles 的 pandas 数据框,它看起来像这样:

         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
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