迭代和平均pandas数据帧

时间:2016-08-20 00:03:11

标签: python pandas

我有一个包含很多行的数据库,例如:

timestamp  name  price  profit
           bob     5      4
           jim     3      2
           jim     2      6 
           bob     6      7
           jim     4      1
           jim     6      3
           bob     3      1

数据库按时间戳排序。我希望能够添加一个新列,它将在当前值之前的price列中取最后2个值,并将它们平均为新列。因此前三行看起来像这样一个新列:

timestamp  name  price  profit  new column
           bob     5       4      4.5 
           jim     3       2       3
           jim     2       6       5

(6+3)/2 = 4.5   
(2+4)/2 = 3  
(4+6)/2 = 5

这不适用于学校项目或其他任何我自己正在研究的事情。我试过问过类似的问题,但我不认为我很清楚。提前谢谢!

2 个答案:

答案 0 :(得分:1)

通过查看您想要的结果,我猜您希望在当前值之后的两个价格的平均值而不是“当前值之前的价格列中的2个值”。

我制作了timestamp个值,你忽略了这些值。

print df
   timestamp name  price  profit
0 2016-01-01  bob      5       4
1 2016-01-02  jim      3       2
2 2016-01-03  jim      2       6
3 2016-01-04  bob      6       7
4 2016-01-05  jim      4       1
5 2016-01-06  jim      6       3
6 2016-01-07  bob      3       1

#No need to sort if you already did.
#df.sort_values(['name','timestamp'], inplace=True)
df['new column'] = (df.groupby('name')['price'].shift(-1) + df.groupby('name')['price'].shift(-2)) / 2
print df.dropna()

   timestamp name  price  profit  new column
0 2016-01-01  bob      5       4         4.5
1 2016-01-02  jim      3       2         3.0
2 2016-01-03  jim      2       6         5.0

答案 1 :(得分:1)

def shift_n_roll(df):
    return df.shift(-1).rolling(2).mean().shift(-1)

df['new column'] = df.groupby('name').price.apply(shift_n_roll)

df

enter image description here