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)
您可以使用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)
| 归档时间: |
|
| 查看次数: |
624 次 |
| 最近记录: |