【问题标题】:How to perform windowed operation on dataframe?如何对数据框执行窗口化操作?
【发布时间】:2020-10-27 20:39:15
【问题描述】:

给定

import pandas as pd
import numpy as np

ssss = pd.DataFrame(np.arange(6))

ssss:

   0
0  0
1  1
2  2
3  3
4  4
5  5

我想对数据框进行滑动窗口操作。

我想在任意大小的滑动窗口上以任意步幅执行 general 函数(在这种情况下意味着,但它可以是另一个函数并且涉及多个输入列)。

在这种情况下,窗口大小为2,步长也为2。

pandas 支持这种操作吗?

回复:

   0 res
0  0 0.5
1  1 0.5
2  2 2.5
3  3 2.5
4  4 4.5
5  5 4.5

看来groupby 不是我要找的。​​p>

我可以使用 numpy 解决方案,但即便如此我也不确定标准方法是什么。我希望 pandas 支持这样的东西,但找不到任何方法可以做到这一点。


编辑:

ssss:

假设第 1 列的值是字符串

   0 1   2
0  0 "5" a
1  1 "4" b
2  2 "3" c
3  3 "2" d
4  4 "1" e
5  5 "0" f

我想用作一个非常普遍的例子

def row_reduce(col0, col1):
    return str(2 * col0) + col1

def col_reduce(rows_data):
    return ",".join(rows_data)

获取(忽略第 2 列)

   0 1   2 res
0  0 "5" a "05,24"
1  1 "4" b "05,24"
2  2 "3" c "43,62"
3  3 "2" d "43,62"
4  4 "1" e "81,100"
5  5 "0" f "81,100"

这首先使用自定义函数执行行缩减,然后执行窗口列缩减。

【问题讨论】:

  • rolling 但令我非常失望的是步长仍然硬编码为 1。
  • @timgeb 我实际上想过这个问题,并且想知道如果步长不是 1 会是什么预期输出。我认为这没有多大意义。

标签: python pandas


【解决方案1】:

如果窗口没有重叠,您可以使用groupby

我认为您需要 GroupBy.transform 进行整数除法:

#if default RangeIndex
ssss['res'] = ssss.groupby(ssss.index // 2)[0].transform('mean')
#any index - helper array
ssss['res'] = ssss.groupby(np.arange(len(ssss)) // 2)[0].transform('mean')
print (ssss)
   0  res
0  0  0.5
1  1  0.5
2  2  2.5
3  3  2.5
4  4  4.5
5  5  4.5

编辑:

print (df)
   0  1  2
0  0  5  a
1  1  4  b
2  2  3  c
3  3  2  d
4  4  1  e
5  5  0  f

def row_reduce(col0, col1):
    return str(2 * col0) + str(col1)

def col_reduce(rows_data):
    return ",".join(rows_data)


df['res'] = (df.apply(lambda x: row_reduce(x[0], x[1]), axis=1)
               .groupby(df.index // 2)
               .transform(col_reduce))
print (df)
   0  1  2     res
0  0  5  a   05,24
1  1  4  b   05,24
2  2  3  c   43,62
3  3  2  d   43,62
4  4  1  e  81,100
5  5  0  f  81,100

【讨论】:

  • 我将如何使用我自己的函数,它可以将更多列作为输入?
  • 请参阅编辑。我尽量做到笼统和精确。
  • 也许",".join 意义不大,但我希望这能传达主要思想
  • 另外,请注意 ssss.index // 2 不允许跨步重叠,但如果这是另一个问题,我不介意。
  • @Gulzar - 不确定是否理解,所以也许新问题会很好,我会离线,所以其他人会为你回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
相关资源
最近更新 更多