我有一个数据框
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(),但没有工作。
还有其他选择吗?
答案 0 :(得分: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
答案 1 :(得分: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