2 回答

TA贡献1820条经验 获得超9个赞
如果我理解你的问题
l=[y.assign(name=y.name.shift(-x[1]+1).values) for x , y in df.groupby(['category','index'])]
Newdf=pd.concat(l)
Newdf
Out[644]:
category name index
0 A A11 1
1 A A12 1
2 A A13 1
3 A A23 2
4 A A24 2
5 A NaN 2

TA贡献1779条经验 获得超6个赞
如果我理解正确,我认为你可以做到这一点的一种方法:
给定 df,
category name index
0 A A11 1
1 A A12 1
2 A A13 1
3 A A21 2
4 A A22 2
5 A A23 2
6 B B11 1
7 B B21 2
使用查询过滤索引不是 1 的地方,然后groupby在索引等于 1 的过滤器数据帧的内部移位并连接部分到移位的数据帧。
df_shifted = (df.query("index > 1").groupby(['category','index'])
.apply(lambda x: x['name'].shift(-1))
.reset_index().set_index('level_2').rename_axis(None))
df_out = pd.concat([df_shifted, df.query("index == 1")], sort=False).sort_index()
df_out
输出:
category index name
0 A 1 A11
1 A 1 A12
2 A 1 A13
3 A 2 A22
4 A 2 A23
5 A 2 NaN
6 B 1 B11
7 B 2 NaN
添加回答
举报