簡體   English   中英

如何對dataframe進行窗口化操作?

[英]How to perform windowed operation on dataframe?

鑒於

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

我想對dataframe進行滑動window操作。

我想在任意大小、任意步長的滑動 window 上執行一般的 function(在本例中是指,但它可以是另一個 function 並且涉及多個輸入列)。

在這種情況下,window 大小為 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不是我要找的。

我可以 go 到 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"

這首先使用自定義 function 執行行縮減,然后執行窗口列縮減。

如果 windows 沒有重疊,您可以使用groupby

我認為您需要GroupBy.transform與 integer 師:

#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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM