在引用pandas DataFrame的下一个元素时省略了循环



让我们考虑以下数据帧:

import pandas as pd
import numpy as np
df = pd.DataFrame([1, 2, 3, 4, 3, 2 , 5, 6, 4, 2, 1, 6])

我想做以下事情:如果数据帧的第I个元素大于下一个的2的平均值,那么我们分配1,如果不是,我们将-1分配给第I个单元。

我的解决方案

一个明显的解决方案如下:

df_copy = df.copy()
for i in range(len(df) - 2):

if (df.iloc[i] > np.mean(df.iloc[(i+1):(i+2)]))[0]:
df_copy.iloc[i] = 1
else:
df_copy.iloc[i] = -1

然而,我发现它有点麻烦,我想知道是否有任何无循环的解决方案来解决这类问题。

所需输出

0
0   -1
1   -1
2   -1
3   1
4   1
5   -1
6   -1
7   1
8   1
9   1
10  1
11  6

您可以使用rolling.meanshift:

df['out'] = np.where(df[0].gt(df[0].rolling(2).mean().shift(-2)), 1, -1)

输出:

0  out
0   1   -1
1   2   -1
2   3   -1
3   4    1
4   3   -1
5   2   -1
6   5   -1
7   6    1
8   4    1
9   2   -1
10  1   -1
11  6   -1

保持最后项目不变:

m = df[0].rolling(2).mean().shift(-2)
df['out'] = np.where(df[0].gt(m), 1, -1)
df['out'] = df['out'].mask(m.isna(), df[0])

输出:

0  out
0   1   -1
1   2   -1
2   3   -1
3   4    1
4   3   -1
5   2   -1
6   5   -1
7   6    1
8   4    1
9   2   -1
10  1    1
11  6    6

最新更新