2017-07-26 7 views
2

は私が新しいデータフレームDF2にデータフレームを変換するために探しています連続の次の値が

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

データフレームを持っている:

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 

は、我々は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のコピーに新しい列を追加またはID列がある

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

Sir、私のID列は整数型ではありません。私の編集したデータフレームを参照してください。最初のコード行であるdf.groupby()。valueを実行しているときにエラーが発生しました。 '' 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

場所にdfに直接新しい列を追加することができます整数ではありません。編集を参照してください。 エラーが発生しました: 'フレームインデックス付きの挿入された列の互換性のないインデックス ' – Shubham

+0

最後に値があるとうまくいかないのですか? – jezrael

+0

上記のエラーが出ます。 '0')= numpy.int64' – Shubham