2017-07-26 83 views
2

我有一個數據幀連續下一個值到新的柱熊貓數據幀

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(),但沒有工作。

除此之外還有其他的選擇嗎?

回答

4

我們想用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 

我們可以到df副本添加一個新列assign

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 
+0

先生,我的id列不是整數類型,請參閱我編輯的數據框。雖然運行df.groupby()值,你的第一行代碼,我得到的錯誤:'「DataFrameGroupBy」對象有沒有屬性「value'' – Shubham

+0

@SRingne,不應該影響結果的。該錯誤表明名爲「value」的列不在「df」中。請證實它是否是。 – piRSquared

+0

工作!其實我拼錯列名!萬分感謝! – Shubham

4

我想你需要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 
+0

id列不是一個整數。請參閱編輯。 我收到錯誤:'與幀索引插入列的不兼容索引' – Shubham

+0

嗯,如果有值到底它不起作用? – jezrael

+0

先生它給出了上面提到的錯誤。 '型(DF [ 'ID'] [0])= 'STR' 和類型(DF [ '值'] [0])= numpy.int64' – Shubham