我有以下熊猫数据框:
K = pd.DataFrame({"A":[1,2,3,4], "B":[5,6,7,8]})
然后将第一行和第一列中的单元格设置为11:
K.iloc[0]["A"] = 11
当我再次检查数据框时,我看到值分配已完成,并且K.iloc [0] [“ A”]等于11。但是,当我向该数据框添加一列并执行相同的操作时对新列中的单元格进行操作,则值分配失败:
K["C"] = 0
K.iloc[0]["C"] = 11
因此,当我再次检查数据帧时,K.iloc [0] [“ C”]的值仍为零。如果有人可以告诉我这里发生了什么以及如何解决此问题,我将不胜感激。
答案 0 :(得分:3)
为简单起见,我将以不同的顺序进行操作,并使用loc
:
K.loc[0, 'C'] = 0
K.loc[0, ['A', 'C']] = 11
答案 1 :(得分:2)
如果默认索引</ strong>,则可以使用 在docs中可能找到解决方案失败的原因: 这有时可以起作用,但不能保证一定可以,因此应该避免: dfc ['A'] [0] = 111 通过DataFrame.loc
使用RangeIndex
,但是它会通过标签0
设置索引值(与位置0相同):< / p>
K['C'] = 0
K.loc[0, ["A", "C"]] = 11
print (K)
A B C
0 11 5 11
1 2 6 0
2 3 7 0
3 4 8 0
DataFrame.iloc
获取列位置可以使用Index.get_indexer
解决方案:print (K.columns.get_indexer(["A", "C"]))
[0 2]
K['C'] = 0
K.iloc[0, K.columns.get_indexer(["A", "C"])] = 11
print (K)
A B C
0 11 5 11
1 2 6 0
2 3 7 0
3 4 8 0
答案 2 :(得分:2)
使用K.iloc[0]["C"]
时,您首先获取第一行,因此从数据框中获取了一个切片的副本,然后获取了列C。因此,您从切片中更改了副本,而不是原始副本数据框。
您的第一个电话K.iloc[0]["A"] = 11
运作良好,从某种意义上来说是一种运气。
一个好习惯是在“一次”中使用loc,因此您可以访问数据框的原始值,而不是切片副本:
K.loc[0,"C"] = 11
请注意,即使iloc和loc在这里看起来很相似,它们的功能也不同。
答案 3 :(得分:2)
loc
应该可以工作:
K.loc[0]['C'] = 11
K.loc[0, 'C'] = 11
以上两种版本的loc
都可以为数据帧K
分配值。