首页 > 解决方案 > 如何计算数据框python中特定值之前的出现次数?

问题描述

我有一个如下的数据框:

A   B   C
1   1   1
2   0   1
3   0   0
4   1   0
5   0   1
6   0   0
7   1   0

df['B']我想要在以下条件下出现零的次数:

if(df['B']<df['C']):
  #count number of zeroes in df['B'] until it sees 1.

预期输出:

A   B   C  output
1   1   1   Nan
2   0   1   1
3   0   0   Nan
4   1   0   Nan
5   0   1   1
6   0   1   0
7   1   0   Nan

我不知道如何制定计数部分。非常感谢任何帮助

标签: pythonpandasdataframecumsum

解决方案


在您的反向系列上使用一些掩蔽和 groupby。这假设二进制数据(只有 0 和 1)


m = df['B'][::-1].eq(0)
d = m.groupby(m.ne(m.shift()).cumsum()).cumsum().sub(1)
d[::-1].where(df['B'] < df['C'])

0    NaN
1    1.0
2    NaN
3    NaN
4    1.0
5    0.0
6    NaN
Name: B, dtype: float64

以及基于快速numpy的方法

def zero_until_one(a, b):
    n = a.shape[0]    
    x = np.flatnonzero(a < b)
    y = np.flatnonzero(a == 1)    
    d = np.searchsorted(y, x)
    r = y[d] - x - 1
    out = np.full(n, np.nan)
    out[x] = r   
    return out

zero_until_one(df['B'], df['C'])

array([nan,  1., nan, nan,  1.,  0., nan])

表现

df = pd.concat([df]*10_000)

%timeit chris1(df)
19.3 ms ± 348 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit yatu(df)
12.8 ms ± 54.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit zero_until_one(df['B'], df['C'])
2.32 ms ± 31.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

推荐阅读