python - 如何计算数据框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
我不知道如何制定计数部分。非常感谢任何帮助
解决方案
在您的反向系列上使用一些掩蔽和 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)
推荐阅读
- php - 如何将现有应用程序与 Joomla 集成?
- c# - PowerShell 导致 C# 应用程序因异常而终止
- java - Java JOptionePane.showInputDialog 将字符更改为 * 用于密码输入
- core-location - 将 CLBeaconRegion 与 Apple Watch 一起使用
- cordova - InAppBrowser 中选择下拉元素上的 Ionic 4 缺少按钮
- python - ValueError:节点的输入 0 与预期的 float_ref 不兼容。**
- java - @ExceptionHandler 没有被调用异常
- java - 使用 CoreMath“公共双...”的语法错误
- angular - 角度 4 模态指令更改大小
- python - 如何将 DEAP 日志写入文本文件?