我有一个数据框:
id value
0 1 0
1 1 100
2 1 200
3 1 300
4 1 0
5 2 0
6 2 500
7 2 600
8 2 0
9 3 0
10 3 700
11 3 0
对于值列中的每个条目,我想添加属于值列中下一行条目的新列,
例如:
id value value2
0 1 0 100
1 1 100 200
2 1 200 300
3 1 300 0
4 2 0 500
5 2 500 600
6 2 600 0
7 3 0 700
8 3 700 0
请您参考如下方法:
选项 1
通过使用 numpy 而不是 pd.Series.shift 我避免了 np.nan 的插入和转换为 float
df.groupby(
'id', group_keys=False
).apply(lambda d: d.iloc[:-1].assign(value2=d.value.values[1:]))
id value value2
0 1 0 100
1 1 100 200
2 1 200 300
3 1 300 0
5 2 0 500
6 2 500 600
7 2 600 0
9 3 0 700
10 3 700 0
选项 2
如果您所有的 'id' 都放在一起,我可以在整个列上执行 np.roll,然后再执行一个简单的 groupby。
df.assign(
value2=np.roll(df.value.values, -1)
).groupby('id', group_keys=False).apply(pd.DataFrame.head, n=-1)
id value value2
0 1 0 100
1 1 100 200
2 1 200 300
3 1 300 0
5 2 0 500
6 2 500 600
7 2 600 0
9 3 0 700
10 3 700 0
