我想對具有相同視窗計數的滾動唯一值求和。
例如,如果有值 20,30,30,40 我想要 (20,30,40) 的總和
在此處輸入影像描述
uj5u.com熱心網友回復:
Pandas 為此提供了一個稱為滾動的功能。這是來自檔案的改編示例:
import pandas as pd
series = pd.Series([20, 30, 40, 50, 60])
series.rolling(3).sum()
輸出:
0 NaN
1 NaN
2 90.0
3 120.0
4 150.0
dtype: float64
uj5u.com熱心網友回復:
您可以聚合連續的相等數字組,然后將滾動總和應用于每個組的第一個元素:
# example dataframe
df = pd.DataFrame({'a':[20, 20, 30, 30, 40, 40, 50, 60]})
# splits into groups
grouping = (df['a']!=df['a'].shift()).cumsum()
# groupby and select first of each group, then apply rolling sum
df.groupby(grouping).agg({'a':'first'}).rolling(3).sum()
輸出:
a
a
1 NaN
2 NaN
3 90.0
4 120.0
5 150.0
uj5u.com熱心網友回復:
如果重復項像您的示例一樣分組,您可以嘗試使用 df.drop_duplicates() 將重復項放在資料框中,然后將 .rolling(3).sum() 應用于新資料幀,而無需任何重復值。
series = pd.Series([20, 30, 30,30,40, 50,50 , 60])
unique_series = series.drop_duplicates()
unique_series.rolling(3,min_periods=1).sum()
在看到上面的 pieterbargs 回應后,我嘗試了以下操作:
df = pd.DataFrame({
'value': [10,20, 30, 50,50,50, 70,80, 90,90],
'id': [1,2,3,4,5,6,7,8,9,10],
})
grouping = (df['value']!=df['value'].shift())
df2 = df[grouping].rolling(3).sum()['value'].rename('sum')
df = df.merge(df2,how='left',left_index=True,right_index=True)
它在 sum 列中生成 NA() 值,但您可以使用填充替換它們。輸出如下:
value id sum
0 10 1
1 20 2
2 30 3 60.0
3 50 4 100.0
4 50 5
5 50 6
6 70 7 150.0
7 80 8 200.0
8 90 9 240.0
9 90 10
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/434024.html
