繁体   English   中英

将新的列pandas数据帧连续的下一个值

[英]Consecutive next value into new column pandas dataframe

我有一个数据帧

id    value
 v1      100
 v1      200
 v1      300
 v1      400
 v2      500
 v2      600
 v2      700
 v3      800
 v3      900

我希望将数据帧转换为新的数据帧df2:

id   val1    val2
v1     100     200
v1     200     300
v1     300     400
v1     400     100
v2     500     600
v2     600     700
v2     700     500
v3     800     900
v3     900     800

即移动下一列中的下一个连续值以及按ID分组的类型,

我尝试使用df.shift(),但没有工作。

有没有替代方案?

我想你需要numpy.roll

df['val2'] = df.groupby('id')['value'].apply(lambda x: pd.Series(np.roll(x, -1))).values
print (df)
   id  value  val2
0   1    100   200
1   1    200   300
2   1    300   400
3   1    400   100
4   2    500   600
5   2    600   700
6   2    700   500
7   3    800   900
8   3    900   800

我们想使用np.roll来完成组内的任务。 通过使用transform ,我们绕过内部组索引挂起。

df.groupby('id').value.transform(np.roll, shift=-1)

0    200
1    300
2    400
3    100
4    600
5    700
6    500
7    900
8    800
Name: value, dtype: int64

我们可以使用assigndf副本添加一个新列

df.assign(val2=df.groupby('id').value.transform(np.roll, shift=-1))

   id  value  val2
0  v1    100   200
1  v1    200   300
2  v1    300   400
3  v1    400   100
4  v2    500   600
5  v2    600   700
6  v2    700   500
7  v3    800   900
8  v3    900   800

或者直接在df中添加一个新列

df['val2'] = df.groupby('id').value.transform(np.roll, shift=-1)

df

   id  value  val2
0  v1    100   200
1  v1    200   300
2  v1    300   400
3  v1    400   100
4  v2    500   600
5  v2    600   700
6  v2    700   500
7  v3    800   900
8  v3    900   800

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM