【发布时间】:2022-07-21 22:46:53
【问题描述】:
让我们考虑一下 pandas 框架:
df = pd.DataFrame([1, 2, 3, 2, 5, 4, 3, 7, 2])
df_top = pd.DataFrame([1, 2, 4, 5, 2, 3, 4, 5, 1])
label_frame = pd.DataFrame([0, 0, 0, 0, 0, 0, 0, 0, 0])
我想做以下事情:
如果任何数字df.iloc[0:3] 大于df_top.iloc[0],则我们将满足此条件的最小索引分配给label_frame 的第一个元素。
对于第一次迭代,它应该如下所示:
我的程序检查:df.iloc[0] > df_top.iloc[0] False、df.iloc[1] > df_top.iloc[0] Truedf.iloc[2] > df_top.iloc[0] True,因此它应该将label_frame 的第一个元素替换为 1,因为它是满足此不等式的最小索引。
我想使用.rolling 函数结合.apply 对整个数据框df 迭代这个程序。 (所以第二个例子应该是df[1:4] > df_top[1],我们替换label_frame的第二个元素)。
你知道怎么做吗?我尝试使用lambda 的自定义函数,但我不知道如何拥有df 的滚动窗口并返回满足不等式的索引的最小值。
for i in range(len(label_frame) - 2):
if (df.iloc[i:i+3] > df_top.iloc[i]).any()[0]:
label_frame.iloc[i] = np.where(df.iloc[0:3] > df_top.iloc[0])[0].min()
label_frame.iloc[-2:, 0] = np.nan
label_frame
0
0 1.0
1 1.0
2 1.0
3 0.0
4 1.0
5 1.0
6 0.0
7 NaN
8 NaN
【问题讨论】:
-
你总是想用 3 个元素还是更多元素来做这个?
-
我总是想去三个,即
df[0:3] > df_top[0]然后df[1:4] > df_top[1],df[2:5] > df_top[2]等等...... -
df[7:?] 如果只取两个值会怎样?
-
可以用NaN填充
-
你能提供明确的预期输出吗?