我有一个带有重复索引的pandas DataFrame。每个索引有3行,它们对应一组项目。有两列,a
和b
。
df = pandas.DataFrame([{'i': b % 4, 'a': abs(b - 6) , 'b': b}
for b in range(12)]).set_index('i')
我想对DataFrame进行排序,以便:
a
。例如,在上面df
,前三个项应该是带有index的项0
,因为a
这三行的最小值是2,而所有其他组都至少有一行的a
值小于2。第二三个项项可以是第3组或第1组,因为这a
两个组中的最小值均为1。最后一组项应是第2组,因为它的行具有a
值为0。
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] 删除。
我来说两句