我有一個如下所示的資料集:
id year value
1 2000 1
1 2002 3
2 1999 10
2 2000 8
2 2001 9
3 2000 12
3 2001 5
3 2003 6
3 2004 7
3 2005 13
3 2006 2
3 2007 1
4 2005 5
4 2006 5
4 2007 5
4 2008 4
4 2009 7
我現在想添加一列,指示每個 ID 遞回計算的標準偏差,包括至少 5 個前幾年的資料(包括相應的當前年份;忽略年份可能丟失的事實),即:
id year value SD
1 2000 1 NA
1 2002 3 NA
2 1999 10 NA
2 2000 8 NA
2 2001 9 NA
3 2000 12 NA
3 2001 5 NA
3 2003 6 NA
3 2004 7 NA
3 2005 13 3.26
3 2006 2 3.86
3 2007 1 4.24
4 2005 5 NA
4 2006 5 NA
4 2007 5 NA
4 2008 4 NA
4 2009 7 0.98
對此的解決方案可以依賴于資料按 id 和年份排序的事實。但是,我也很欣賞不明確依賴于排序的解決方案。任何幫助表示贊賞,謝謝。
uj5u.com熱心網友回復:
您可以在分組和排序的資料上使用最小尺寸的擴展視窗5:
df['SD'] = df.groupby('id').value.apply(lambda x: x.expanding(5).std(ddof=0))
結果:
id year value SD
0 1 2000 1 NaN
1 1 2002 3 NaN
2 2 1999 10 NaN
3 2 2000 8 NaN
4 2 2001 9 NaN
5 3 2000 12 NaN
6 3 2001 5 NaN
7 3 2003 6 NaN
8 3 2004 7 NaN
9 3 2005 13 3.261901
10 3 2006 2 3.862210
11 3 2007 1 4.237828
12 4 2005 5 NaN
13 4 2006 5 NaN
14 4 2007 5 NaN
15 4 2008 4 NaN
16 4 2009 7 0.979796
(默認情況下,pandas 使用 ddf(自由度增量)為 1,而 numpy 默認使用 0)
uj5u.com熱心網友回復:
使用DataFrame.pivotwithDataFrame.reindex所有年份然后計數DataFrame.expandingwith std,最后重新使用DataFrame.stack并在 中添加新列DataFrame.join:
df1 = df.pivot('id','year','value')
s = (df1.reindex(range(df1.columns.min(), df1.columns.max() 1), axis=1)
.expanding(5, axis=1).std(ddof=0)
.stack())
df1 = df.join(s.rename('SD'), on=['id','year'])
print (df1)
id year value SD
0 1 2000 1 NaN
1 1 2002 3 NaN
2 2 1999 10 NaN
3 2 2000 8 NaN
4 2 2001 9 NaN
5 3 2000 12 NaN
6 3 2001 5 NaN
7 3 2003 6 NaN
8 3 2004 7 NaN
9 3 2005 13 3.261901
10 3 2006 2 3.862210
11 3 2007 1 4.237828
12 4 2005 5 NaN
13 4 2006 5 NaN
14 4 2007 5 NaN
15 4 2008 4 NaN
16 4 2009 7 0.979796
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/383066.html
