# My first variant
%timeit df.assign(new=(df.values[:, ::-1] != 0).argmax(1))
# My second variant
%timeit df.assign(new=(df.values[:, ::-1].astype(bool)).argmax(1))
# jezrael's solution
%timeit df.assign(new=df.iloc[:,::-1].cumsum(1).eq(0).sum(1))
# numpy version of jezrael's solution
%timeit df.assign(new=(df.values[:,::-1].cumsum(1) == 0).sum(1))
# Scott Boston's solution
%timeit df.assign(new=df.iloc[:,::-1].eq(0).cumprod(axis=1).sum(axis=1))
# numpy version of Scott Boston's solution
%timeit df.assign(new=(df.values[:,::-1] == 0).cumprod(1).sum(1))
小数据
1000 loops, best of 3: 301 µs per loop
1000 loops, best of 3: 273 µs per loop
1000 loops, best of 3: 770 µs per loop
1000 loops, best of 3: 323 µs per loop
1000 loops, best of 3: 647 µs per loop
1000 loops, best of 3: 324 µs per loop
较大的数据
df = pd.DataFrame(np.random.choice([0, 1], (10000, 100), p=(.7, .3)))
100 loops, best of 3: 6.03 ms per loop
100 loops, best of 3: 5.3 ms per loop
100 loops, best of 3: 16.9 ms per loop
100 loops, best of 3: 9 ms per loop
100 loops, best of 3: 10.7 ms per loop
100 loops, best of 3: 10.1 ms per loop
我会在布尔数组上使用
argmax
。另外,如果我直接跳到numpy
,我可以很快完成。你知道吗或者非常相似
我可以用
assign
将它放在一个新列中或在适当位置添加新列
时间安排 我们通过减少必要的工作来减少时间。我们只需要找到第一个非零的位置。你知道吗
小数据
较大的数据
您可以使用:
[::-1]
倒序axis=1
)True
的^{使用
eq
、cumprod
和sum
(这与回答的问题here非常相似)输出:
相关问题 更多 >
编程相关推荐