簡體   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