【问题标题】:Grouping using Sliding Window and Transpose使用滑动窗口和转置进行分组
【发布时间】:2018-05-10 09:18:57
【问题描述】:

一个数据框(df)包含如下两列:

A    B
46   0
45   1
46   1
51   1
47   1
46   1
45   0
48   0
47   0
45   1
49   1

我需要为每三行设计一个滑动窗口类型的分组,这样:

1)取前三行,转置列(A)并附加列(B)的第三个条目,所以我们得到一行四列如下:

46 45 46 1

2) 然后向下移动一行(即从原始 df 中的第 2 行开始),重复第 1 步,得到如下第二个输出。

45 46 51 1

3) 在每次迭代中,我们得到如下的连续输出:

46 51 47 1
51 47 46 1
47 46 45 0
...

总之,想要的输出是 -

46 45 46 1
45 46 51 1
46 51 47 1
51 47 46 1
47 46 45 0
...

【问题讨论】:

  • 为了清晰起见,我冒昧地编辑了您的帖子并提供了所需的输出...如果不正确则回滚。

标签: python pandas numpy dataframe


【解决方案1】:

这是使用numpystride_tricks的解决方案-

as_strided = np.lib.stride_tricks.as_strided

w = 3  # window size

i = as_strided(df.A.values, (len(df) - (w - 1), w), df.A.strides * 2)
j = df[['B']].values[(w - 1):]

np.hstack((i, j))

array([[46, 45, 46,  1],
       [45, 46, 51,  1],
       [46, 51, 47,  1],
       [51, 47, 46,  1],
       [47, 46, 45,  0],
       [46, 45, 48,  0],
       [45, 48, 47,  0],
       [48, 47, 45,  1],
       [47, 45, 49,  1]])

【讨论】:

  • @jezrael 你误解了这个问题...... OP想要一个滚动转置
  • @jezrael 所以,我认为 OP 试图做的是提供关于如何形成输出的逐步迭代解释。我想这就是让你感到困惑的地方。把每次迭代的输出放在一起,问题就清楚了一点
  • 谢谢你们......事实上我想要@cᴏʟᴅsᴘᴇᴇᴅ 使用滑动窗口发布的答案。
  • @cᴏʟᴅsᴘᴇᴇᴅ zip 方法
  • @MuhammadAsifKhan 不客气。我怀疑任何东西都可以在速度方面超越这一点。看到这样的解决方案,我会非常感到惊讶。
【解决方案2】:

这是一个 numpy 和 python 的方法

def get_list(x,m) : return list(zip(*(x[i:] for i in range(m))))

A = np.array(get_list(df['A'],3))
B = np.array(get_list(df['B'],3))[:,-1]
new = np.append(A,B[:,None],1)

array([[46, 45, 46,  1],
       [45, 46, 51,  1],
       [46, 51, 47,  1],
       [51, 47, 46,  1],
       [47, 46, 45,  0],
       [46, 45, 48,  0],
       [45, 48, 47,  0],
       [48, 47, 45,  1],
       [47, 45, 49,  1]])

正如@coldspeed 所说,转换需要时间并且在计算上有点昂贵,因此我们可以使用简单的列表理解,即

A = get_list(df['A'],3)
B = get_list(df['B'],3)
new = [(*i,j[-1]) for i,j in zip(A,B)]

[(46, 45, 46, 1),
 (45, 46, 51, 1),
 (46, 51, 47, 1),
 (51, 47, 46, 1),
 (47, 46, 45, 0),
 (46, 45, 48, 0),
 (45, 48, 47, 0),
 (48, 47, 45, 1),
 (47, 45, 49, 1)]

【讨论】:

  • 但请记住...如果您使用np.append 的方法,则总是 更快地附加到python 列表并稍后转换一次。转换成本高,需要分配内存。
猜你喜欢
  • 2021-06-22
  • 1970-01-01
  • 2015-04-03
  • 2020-12-25
  • 2021-01-15
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 2021-10-29
相关资源
最近更新 更多