在第一次出现值

时间:2016-08-01 20:01:20

标签: python-2.7 pandas

我有这样的df:

Year  ID Count
1997  1  0
1998  2  0
1999  3  1
2000  4  0
2001  5  1

我希望在1中第一次出现Count之前删除所有行,这会给我:

Year  ID Count
1999  3  1
2000  4  0
2001  5  1

我可以在第一次出现之后删除所有行,如下所示:

df=df.loc[: df[(df['Count'] == 1)].index[0], :]

但我似乎无法按照切片逻辑来做相反的事情。

4 个答案:

答案 0 :(得分:3)

您可以使用cumsum()方法:

In [13]: df[(df.Count == 1).cumsum() > 0]
Out[13]:
   Year  ID  Count
2  1999   3      1
3  2000   4      0
4  2001   5      1

说明:

In [14]: (df.Count == 1).cumsum()
Out[14]:
0    0
1    0
2    1
3    1
4    2
Name: Count, dtype: int32

时间对500K行DF:

In [18]: df = pd.concat([df] * 10**5, ignore_index=True)

In [19]: df.shape
Out[19]: (500000, 3)

In [20]: %timeit df[(df.Count == 1).idxmax():]
100 loops, best of 3: 3.7 ms per loop

In [21]: %timeit df[(df.Count == 1).cumsum() > 0]
100 loops, best of 3: 16.4 ms per loop

In [22]: %timeit df.loc[df[(df['Count'] == 1)].index[0]:, :]
The slowest run took 4.01 times longer than the fastest. This could mean that an intermediate result is being cached.
100 loops, best of 3: 7.02 ms per loop

结论:@ piRSquared的idxmax()解决方案是明显的赢家......

答案 1 :(得分:3)

我会这样做:

df[(df.Count == 1).idxmax():]

enter image description here

df.Count == 1返回一个布尔数组。 idxmax()将标识最大值的索引。我知道最大值将是True,当有多个True时,它将返回找到的第一个的位置。这正是你想要的。顺便说一下,该值为2。最后,我为2以及df[2:]的所有内容切片数据帧。我把所有这些都放在上面的答案中。

答案 2 :(得分:1)

只是以另一种方式切片:

如果idx是你的索引,请执行:

let FooCtor = Object.getPrototypeOf(Bar.prototype).constructor;
var foo = new FooCtor();

而不是

df.loc[idx:]

这意味着:

df.loc[:idx]

答案 3 :(得分:1)

使用np.where

df = pd.concat([df]*10**5, ignore_index=True)

<强>计时

计时是在更大版本的DataFrame上进行的:

%timeit df[np.where(df['Count']==1)[0][0]:]  
100 loops, best of 3: 2.74 ms per loop

%timeit df[(df.Count == 1).idxmax():] 
100 loops, best of 3: 6.18 ms per loop

%timeit df[(df.Count == 1).cumsum() > 0] 
10 loops, best of 3: 26.6 ms per loop

%timeit df.loc[df[(df['Count'] == 1)].index[0]:, :]
100 loops, best of 3: 11.2 ms per loop

结果:

<div id="AttackDiv">
    <div id="ImageDiv">
    </div>
    <div id="ContentDiv">
    </div>
    <div id="SkillDiv">
    </div>
</div>