我有一个如下的数据框,只是一个例子。
date y w diff
2010-1-1 3 1 3
2010-1-2 4 1 4
2010-1-3 5 1 2
2010-1-4 6 2 5
2010-1-5 7 2 6
2010-1-6 8 2 5
2010-1-7 9 3 2
2010-1-8 10 4 4
2010-1-9 11 5 5
2010-1-10 12 6 6
2010-1-11 13 5 6
现在例如 i 是数据框的索引,我想为数据框添加新列,有三个新列名,如 p1、p2、p3,但值为前两个日期的值。当然前两行值p1,p2是Nan。从3-5行,p1、p2的值都是3、4,p3的值是前两行的最后一个diff的值,我的意思是从3-5行p3的值都是4。我使用五行作为一个句点。我的意思是 8-10 行,p1、p2、p3 的值是 8、9、2。新的数据框如下所示:
date y w diff p1 p2 p3
2010-1-1 3 1 3 Nan Nan Nan
2010-1-2 4 1 4 Nan Nan Nan
2010-1-3 5 1 2 3 4 4
2010-1-4 6 2 5 3 4 4
2010-1-5 7 2 6 3 4 4
2010-1-6 8 2 5 Nan Nan Nan
2010-1-7 9 3 2 Nan Nan Nan
2010-1-8 10 4 4 8 9 2
2010-1-9 11 5 5 8 9 2
2010-1-10 12 6 6 8 9 2
2010-1-11 13 5 6 Nan Nan Nan
如果有什么你不明白我的问题,请评论。谢谢!
您可以使用groupby
by array g
created byarange
和 floor Division 与自定义函数,shift
然后根据要求在 numpy 数组中设置值。最后添加到原始作者join
:
df['date'] = pd.to_datetime(df['date'])
g = np.arange(len(df.index)) // 5
def f(x):
x = x.shift(2)
a = x.values
if a.shape[0] > 3:
a[3,1] = a[3, 0]
a[3,0] = a[2, 0]
a[2] = a[3]
a[4] = a[3]
return pd.DataFrame(a, index=x.index, columns=['p1','p2','p3'])
df1 = df.groupby(g)['y','w','diff'].apply(f)
print (df1)
p1 p2 p3
0 NaN NaN NaN
1 NaN NaN NaN
2 3.0 4.0 4.0
3 3.0 4.0 4.0
4 3.0 4.0 4.0
5 NaN NaN NaN
6 NaN NaN NaN
7 8.0 9.0 2.0
8 8.0 9.0 2.0
9 8.0 9.0 2.0
10 NaN NaN NaN
df2 = df.join(df1)
print (df2)
date y w diff p1 p2 p3
0 2010-01-01 3 1 3 NaN NaN NaN
1 2010-01-02 4 1 4 NaN NaN NaN
2 2010-01-03 5 1 2 3.0 4.0 4.0
3 2010-01-04 6 2 5 3.0 4.0 4.0
4 2010-01-05 7 2 6 3.0 4.0 4.0
5 2010-01-06 8 2 5 NaN NaN NaN
6 2010-01-07 9 3 2 NaN NaN NaN
7 2010-01-08 10 4 4 8.0 9.0 2.0
8 2010-01-09 11 5 5 8.0 9.0 2.0
9 2010-01-10 12 6 6 8.0 9.0 2.0
10 2010-01-11 13 5 6 NaN NaN NaN
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句