Python 2.7 python2.7数据框架:从现有列值添加新列

Python 2.7 python2.7数据框架:从现有列值添加新列,python-2.7,dataframe,Python 2.7,Dataframe,我有一个数据帧,如下所示,只是一个例子 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 201

我有一个数据帧,如下所示,只是一个例子

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。我用这五行作为句点。我的意思是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
如果你不明白我的问题,请评论一下。谢谢

您可以使用由
arange
创建的
array g
和带有自定义功能的楼层划分,然后根据需要在numpy数组中设置值。最后添加到原始文件的人:



谢谢@jezrael,还有一个问题,你能帮我解决吗。
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