为熊猫数据框中的下一个连续行添加新列

Shu*_*m R 2 python dataframe pandas

我有一个数据框:

    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
Run Code Online (Sandbox Code Playgroud)

对于值列中的每个条目,我想添加属于值列中下一行条目的新列,

例如:

     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 
Run Code Online (Sandbox Code Playgroud)

piR*_*red 5

选项 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
Run Code Online (Sandbox Code Playgroud)

选项 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
Run Code Online (Sandbox Code Playgroud)