按多列和重复索引对pandas DataFrame进行排序

用户名

我有一个带有重复索引的pandas DataFrame。每个索引有3行,它们对应一组项目。有两列,ab

df = pandas.DataFrame([{'i': b % 4, 'a': abs(b - 6) , 'b': b}
                       for b in range(12)]).set_index('i')

我想对DataFrame进行排序,以便:

  1. 具有相同索引的所有行都是相邻的。(所有组都在一起)
  2. 这些组按组中的最小值反向排列a

例如,在上面df,前三个项应该是带有index的项0,因为a这三行的最小值是2,而所有其他组都至少有一行的a值小于2。第二三个项项可以是第3组或第1组,因为这a两个组中的最小值均为1。最后一组项应是第2组,因为它的行具有a值为0。

  1. 在每个组中,项目按升序排列b

所需的输出:

    ab 
i 
0 6 0 
0 2 4 
0 2 8 
3 3 3 
3 1 7 
3 5 11 
1 5 1 
1 1 5 
1 3 9 
2 4 2 
2 0 6 
2 4 10

我一直在尝试类似的东西:

df.groupby('i')[['a']].transform(min).sort(['a', 'b'], ascending=[0, 1])

但这给了我一个KeyError,并且只有在我创建i列而不是索引的情况下,它才会达到那个程度

克里斯布

我看到的最直接的方法是将索引移动到列,然后使用min组计算新列。

In [43]: df = df.reset_index()

In [45]: df['group_min'] = df.groupby('i')['a'].transform('min')

然后,您可以根据您的条件进行排序:

In [49]: df.sort_values(['group_min', 'i', 'b'], ascending=[False, False, True])
Out[49]: 
    i  a   b  group_min
0   0  6   0          2
4   0  2   4          2
8   0  2   8          2
3   3  3   3          1
7   3  1   7          1
11  3  5  11          1
1   1  5   1          1
5   1  1   5          1
9   1  3   9          1
2   2  4   2          0
6   2  0   6          0
10  2  4  10          0

要返回所需的帧,请删除跟踪变量并重置索引。

In [50]: df.sort_values(['group_min', 'i', 'b'], ascending=[False, False, True]).drop('group_min', axis=1).set_index('i')
Out[50]: 
   a   b
i       
0  6   0
0  2   4
0  2   8
3  3   3
3  1   7
3  5  11
1  5   1
1  1   5
1  3   9
2  4   2
2  0   6
2  4  10

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

同时按列索引和行索引对Pandas DataFrame进行排序

Pandas Dataframe Mutli索引按级别和列值排序

按其他索引的顺序对Pandas Dataframe进行排序

在DataFrame中对列进行排序

按特定顺序对Pandas DataFrame中的列进行排序

按列中的名称对pandas DataFrame中的数据进行排序

在 Pandas DataFrame 中按逗号数对列进行排序

根据列值对 Pandas Dataframe 进行排序

对Pandas Dataframe列中的列表进行排序

在Pandas DataFrame中对列进行排序

Python Pandas按列排序多索引,但保留树结构

按列对数据框多索引级别进行排序

按MultiIndex的一级对pandas DataFrame进行排序

pandas Dataframe groupby,按绝对值对组进行排序

按日期对Pandas数据框列索引进行排序

在Pandas Dataframe中显示多列,但仅按一列进行分组和计数

按索引和列排序

按值排序的多索引-Pandas

pandas dataframe根据列总数对列进行排序

在 Pandas 中对 DataFrame 进行排序和切片

如何通过MultiIndex和值对Pandas DataFrame进行排序?

使用For循环对Pandas DataFrame进行排序和重新排列

Pandas Dataframe按列排序

根据列值对具有MultiIndex的pandas DataFrame进行排序

Pandas DataFrame 对每一列进行排序

使用带有列表的列对 Pandas DataFrame 进行排序

为什么我的 Pandas DataFrame 没有对列进行排序?

如何按列和索引连接Pandas DataFrame?

如何按两列或更多列对python pandas中的dataFrame进行排序?