【问题标题】:Obtaining minimal index with .rolling使用 .rolling 获取最小索引
【发布时间】: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] Falsedf.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填充
  • 你能提供明确的预期输出吗?

标签: python pandas


【解决方案1】:

IIUC,如果您只想测试 3 个值,最简单的方法可能是使用 2D 比较:

a = df.assign(**{'1': df[0].shift(-1), '2': df[0].shift(-2)}).eq(df_top).to_numpy()
m = a.any(1)
label_frame[0] = df.index + np.where(m, a.argmax(1), np.nan)

输出:

     0
0  0.0
1  1.0
2  NaN
3  NaN
4  NaN
5  NaN
6  NaN
7  NaN
8  NaN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-13
    • 2016-10-18
    • 1970-01-01
    • 2017-03-03
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    相关资源
    最近更新 更多