我正在尝试实现一个小算法,根据另一列上的某个条件是否超过阈值,在我的DataFrame中创建一个新列。公式如下:
df.loc[:, 'new_column'] = 0
df.loc[sum(abs(np.diff(df.loc[:, 'old_column']) / df.loc[:, 'old_column'].mean())) > threshold, 'new_column'] = 1
然而,现在我不想将此公式应用于DataFrame的整个高度,而是希望应用滚动窗口,即公式中计算的平均值滚动通过DataFrame的行。我在文档中找到了这个页面,但不知道如何将其应用于像我这样的公式。我怎么能做这样的事?
使用列名a
和b
而不是old_column
和new_column
:
df = pd.DataFrame(np.random.randint(10, size=10), columns=['a'])
window = 3
val = df['a'].diff().abs() / df['a'].rolling(window, 1).mean()
threshold = 1
condition = (val > threshold)
df['b'] = 0
df.loc[condition, 'b'] = 1
示例结果:
a b
0 1 0
1 7 1
2 6 0
3 1 1
4 8 1
5 2 1
6 3 0
7 1 0
8 0 0
9 8 1
请密切关注中间结果中的NaN
值。CCD_ 6返回第一行中的CCD_。这与np.diff()
不同,因为np.diff()
返回的数组比输入小。
rolling().mean()
将根据您的min_periods
参数返回NaN
值。
最终结果不包含NaN
值,因为对于NaN
输入,(val > threshold)
总是False
。