python - 在不改变分组列位置的情况下按另一组中的一列排序

标签 python pandas numpy

考虑df

df = pd.DataFrame(dict(A=list('babbaa'), B=list('zxyxzy')))
df

enter image description here

我想用 A 定义的组对 B 进行排序。但我不想改变 A 的位置。

如果我尝试:

df.groupby('A', sort=False) \
    .apply(pd.DataFrame.sort_values, by='B') \
    .reset_index(drop=True)

enter image description here

您会注意到 A 组合在一起。我想要这个:

enter image description here

最佳答案

这是我想出来的

df = pd.DataFrame(dict(A=list('babbaa'), B=list('zxyxzy')))

A, B = df.A.values, df.B.values

使用np.unique inverse(所有相对位置的索引值)。

u, iv = np.unique(A, return_inverse=True)

使用反向和广播为每个组创建一行,其中每一行都是该组的 bool 掩码。

is_ = np.arange(len(u))[:, None] == iv

遍历行并使用更新值重新分配位置跟踪数组 i

i = np.arange(len(df))
for r in is_:
    i[r] = i[r][df.B.values[r].argsort()]

使用新的位置值

df.iloc[i]

enter image description here


目前,我不知道如何摆脱这个循环。

关于python - 在不改变分组列位置的情况下按另一组中的一列排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40903704/

相关文章:

python - 生成两个数字之间的随机数

python - 合并不同范围的直方图

python - 使用 Django 实现配置应用程序的最佳方法是什么?

python - 哪种方法更好地重置 Pandas 数据框中的索引?

python - Pandas 数据帧 : expanding data to full month

python - Scipy:泊松拟合不适用于特定数据集

python - 如何从numpy中的D数组创建D维坐标数组

python - 在python中构造类,对象的正确方法是什么

意外标记附近的 Python 语法错误

用于检查重复行和重复列的 Python 错误日志记录