在一组内使用pandas.shift()

时间:2018-11-16 10:08:14

标签: python pandas pandas-groupby

我有一个包含面板数据的数据框,比方说这是100个不同对象的时间序列:

object  period  value 
1       1       24
1       2       67
...
1       1000    56
2       1       59
2       2       46
...
2       1000    64
3       1       54
...
100     1       451
100     2       153
...
100     1000    21

我想添加一个新列prev_value,该列将为每个对象存储先前的value

object  period  value  prev_value
1       1       24     nan
1       2       67     24
...
1       99      445    1243
1       1000    56     445
2       1       59     nan
2       2       46     59
...
2       1000    64     784
3       1       54     nan
...
100     1       451    nan
100     2       153    451
...
100     1000    21     1121

我可以以某种方式使用.shift()和.groupby()吗?

3 个答案:

答案 0 :(得分:2)

是的,只需:

df['prev_value'] = df.groupby('object')['value'].shift()

对于此示例数据框:

print(df)

     object  period  value
0       1       1     24
1       1       2     67
2       1       4     89
3       2       4      5
4       2      23     23

结果将是:

     object  period  value  prev_value
0       1       1     24         NaN
1       1       2     67        24.0
2       1       4     89        67.0
3       2       4      5         NaN
4       2      23     23         5.0

答案 1 :(得分:2)

如果您的DataFrame已按分组键排序,则可以在整个DataFrame上使用单个data.pca <- prcomp(dataPCA[,2:4], scale. = TRUE) g <- ggbiplot(data.pca, obs.scale = 1, var.scale = 1, groups = as.factor(dataPCA$Gender), ellipse = TRUE, circle = TRUE) g <- g + scale_color_discrete(name = '') g <- g + theme(legend.direction = 'horizontal', legend.position = 'top') print(g) ,并使用shiftwhere溢出到下一组的行。对于具有多个组的较大DataFrame,这可能会更快一些。

NaN

一些与性能相关的时间安排:

df['prev_value'] = df['value'].shift().where(df.object.eq(df.object.shift()))

   object  period  value  prev_value
0       1       1     24         NaN
1       1       2     67        24.0
2       1       4     89        67.0
3       2       4      5         NaN
4       2      23     23         5.0

enter image description here

答案 2 :(得分:-1)

仅从现有列创建一个新列。

data["prev_value"] = data["value"]