如何在一列定义的分区内进行排序,但将分区保留在原来的位置?

piR*_*red 5 python sorting numpy pandas

考虑数据帧 df

df = pd.DataFrame(dict(
        A=list('XXYYXXYY'),
        B=range(8, 0, -1)
    ))

print(df)

   A  B
0  X  8
1  X  7
2  Y  6
3  Y  5
4  X  4
5  X  3
6  Y  2
7  Y  1
Run Code Online (Sandbox Code Playgroud)

'X'通过列定义的组'A',我想排序[8, 7, 4, 3]到预期的[3, 4, 7, 8].但是,我希望将这些行留在原来的位置.

   A  B
5  X  3  <-- Notice all X are in same positions
4  X  4  <-- However, `[3, 4, 7, 8]` have shifted
7  Y  1
6  Y  2
1  X  7  <-- 
0  X  8  <-- 
3  Y  5
2  Y  6
Run Code Online (Sandbox Code Playgroud)

roo*_*oot 4

您可以使用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))
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以将上面的两行合并为一长行。

结果输出:

   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
Run Code Online (Sandbox Code Playgroud)

请注意,如果您不关心维护旧索引,则可以直接从以下位置重新分配transform

df['B'] = df.groupby('A')['B'].transform(lambda grp: grp.sort_values())
Run Code Online (Sandbox Code Playgroud)

其产量:

   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
Run Code Online (Sandbox Code Playgroud)