我有一个数据,如下所示,只是一个例子。
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例如,我是dataframe的索引,我想为dataframe添加新列,有三个新的列名类似于,p1,p2,p3,但是值是前两个日期的值。当然,前两行的值是p1,p2是Nan。从3到5行,p1、p2均为3、4,p3值为前两行的最后差值,即3-5行的p3值均为4,以这5行为句号。我指的是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如果你有什么不明白我的问题,请评论。谢谢!
发布于 2017-06-20 11:19:33
您可以使用由groupby创建的array g的array g和带有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 NaNdf2 = 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 NaNhttps://stackoverflow.com/questions/44649687
复制相似问题