我有一个名为等位基因的熊猫数据框,如下所示:
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
答案 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
。