您可以transform
用来取回新的所需索引顺序,然后用于reindex
重新排列DataFrame:
# Use transform to return the new ordered index values.
new_idx = df.groupby('A')['B'].transform(lambda grp: grp.sort_values().index)
# Reindex.
df = df.reindex(new_idx.rename(None))
如果需要,可以将上面的两行合并为一条长行。
结果输出:
A B
5 X 3
4 X 4
7 Y 1
6 Y 2
1 X 7
0 X 8
3 Y 5
2 Y 6
请注意,如果您不关心维护旧索引,则可以直接从中重新分配transform
:
df['B'] = df.groupby('A')['B'].transform(lambda grp: grp.sort_values())
产生:
A B
0 X 3
1 X 4
2 Y 1
3 Y 2
4 X 7
5 X 8
6 Y 5
7 Y 6