我有这样的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], :]
但我似乎无法按照切片逻辑来做相反的事情。
答案 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():]
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>