> import pandas as pd
> df = pd.DataFrame({'A':xrange(1,10),'B':xrange(0,9)})
> print df
A B
0 1 0
1 2 1
2 3 2
3 4 3
4 5 4
5 6 5
6 7 6
7 8 7
8 9 8
我需要将B的前两个匹配项(在将条件df.A % 2 == 0
过滤后)替换为-1
> print output
A B
0 1 0
1 2 -1
2 3 2
3 4 -1
4 5 4
5 6 5
6 7 6
7 8 7
8 9 8
我尝试过df.B[df.A % 2 == 0][0:2] = -1
或 df["B"][df.A % 2 == 0][0:2] = -1
- 这不是导致错误,但甚至没有替换?什么可能出错?
但是,当我尝试df.B[df.A %2 == 0] = -1
时 - 它正在运行(但用-1
替换所有匹配项。)
答案 0 :(得分:3)
您已经知道了,因为您使用chained slicing并且您已获得数据的副本,但没有原始数据的副本。来自docs:
由于链式索引是2个调用,因此可能要么调用 由于切片的方式,可能会返回数据的副本。从而 设置时,实际上是设置副本,而不是原始副本 帧数据。大熊猫不可能弄明白这一点,因为 它们是2个未连接的独立python操作。
您可以使用一个切片来解决您的问题:
mask = df.A%2 == 0
idx = mask[mask].index
df.B[idx[:2]] = -1
In [91]: df
Out[91]:
A B
0 1 0
1 2 -1
2 3 2
3 4 -1
4 5 4
5 6 5
6 7 6
7 8 7
8 9 8
In [92]: mask
Out[92]:
0 False
1 True
2 False
3 True
4 False
5 True
6 False
7 True
8 False
Name: A, dtype: bool
In [93]: idx
Out[93]: Int64Index([1, 3, 5, 7], dtype='int64')