Python - 在条件匹配上替换前2行

时间:2016-03-09 09:50:36

标签: python pandas

> 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替换所有匹配项。)

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')