我想出了这个解决方案,但我想知道是否有一些内置函数可以更好,更快或以更python的方式执行此操作
import numpy as np
import pandas as pd
n = 1 #number of trials
p = 0.5 #prob of succes
k = 50 #amount of reptitions
s = pd.Series(np.random.binomial(n, p, k)).to_frame()
s.columns = ['data']
s['shifted'] = s['data'].shift(1)
s['lagged'] = s['data'].shift(-1)
s['two_ones_in_a_row'] = (s['data'] & s['lagged']) | (s['data'] & s['shifted'])
在我看来,解决方案很好,也不需要新列,您可以按Series
进行比较:
s = pd.Series(np.random.binomial(n, p, k)).to_frame()
s.columns = ['data']
s1= s['data'].shift(1)
s2 = s['data'].shift(-1)
s['two_ones_in_a_row'] = (s['data'] & s2) | (s['data'] & s1)
如果性能很重要,请使用 numpy:
a = s['data'].values.astype(bool)
s['two_ones_in_a_row1'] = (a & np.append(a[1:], False)) | (a & np.append(False, a[:-1]))
n = 1 #number of trials
p = 0.5 #prob of succes
k = 50000 #amount of reptitions
s = pd.Series(np.random.binomial(n, p, k)).to_frame()
s.columns = ['data']
In [153]: %%timeit
...: s1= s['data'].shift(1)
...: s2 = s['data'].shift(-1)
...: s['two_ones_in_a_row'] = (s['data'] & s2) | (s['data'] & s1)
...:
21 ms ± 581 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [154]: %%timeit
...: a = s['data'].values.astype(bool)
...: s['two_ones_in_a_row1'] = (a & np.append(a[1:], False)) | (a & np.append(False, a[:-1]))
...:
213 µs ± 2.92 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)