使用 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
。
我有一个名为 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
。