【发布时间】:2017-11-24 00:09:12
【问题描述】:
我有一个如下的数据框:
df = pd.DataFrame([[1,2],[10,20],[10,2],[1,40]],columns = ['a','b'])
a b
0 1 2
1 10 20
2 10 2
3 1 40
我要选择a == 1所在的b列,下面是经典的选择:
df[df.a == 1].b
a b
0 1 2
3 1 40
然后我想选择这个子数据帧的第 i 行,它不是索引为 i 的行。还有几种方法,如下所示:
df[df.a == 1].b.iloc[[1]]
Output:
3 40
Name: b, dtype: int64
到目前为止一切顺利。问题是当我尝试修改我得到的值时,实际上这种选择方法会产生数据帧切片的副本,而不是对象本身。因此我无法就地修改它。
test[test.a == 1].b.iloc[[1]] = 3
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
我不知道“复制”问题出在哪一部分,因为以下两个产生了相同的问题:
test.iloc[[3]].b = 3
test[test.a == 1].b = 3
所以我的问题是:如何通过掩码选择(有条件地在 a 列值上)和行选择(通过子数据框中行的排名,而不是其索引值)来更改值)?
【问题讨论】: