我有一个包含面板数据的数据框,比方说这是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()吗?
答案 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)
,并使用shift
至where
溢出到下一组的行。对于具有多个组的较大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
答案 2 :(得分:-1)
仅从现有列创建一个新列。
data["prev_value"] = data["value"]