data = pandas.DataFrame(numpy.random.randn(4,3))
0 1 2
0 -1.122880 -2.662009 1.180418
1 -0.335768 0.162640 0.105928
2 -1.282813 0.049638 1.532208
3 -0.422884 -1.110049 0.031648
寻找一个函数(get_ranks(data)
?),它将返回一组有序的(row,col)元组。所以对于上述内容:
(2,2),(0,2),(3,2),(1,1),......
使用庞大的数据集并尝试有效地返回对DataFrame元素进行排名的元组。尝试了apply()
,rank()
等一些尴尬的序列,但想要更好的东西。
我搜索了一堆,但没有找到适用于此的评论。我应该将行或列一起捕捉并从那里排名吗?还是有更直接的路径?
答案 0 :(得分:1)
以下是您可以做的事情:
>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame(np.random.randn(4,3))
>>> df
0 1 2
0 1.644294 1.476467 -0.137539
1 -0.448040 -0.329539 -0.996425
2 -1.015308 -1.397746 0.369095
3 -0.570194 -0.989716 -1.489257
>>> df2 = pd.DataFrame(df.values.flatten())
>>> df2
0
0 1.644294
1 1.476467
2 -0.137539
3 -0.448040
4 -0.329539
5 -0.996425
6 -1.015308
7 -1.397746
8 0.369095
9 -0.570194
10 -0.989716
11 -1.489257
>>> df3 = df2.rank()
>>> df3['row'] = df3.index % 4
>>> df3['column'] = (df3.index/4).astype(int)
>>> df3
0 row column
0 12.0 0 0
1 11.0 1 0
2 9.0 2 0
3 7.0 3 0
4 8.0 0 1
5 4.0 1 1
6 3.0 2 1
7 2.0 3 1
8 10.0 0 2
9 6.0 1 2
10 5.0 2 2
11 1.0 3 2
一些解释:
我展平原始DataFrame,然后使用rank()
获取展平数组中值的等级。
然后我使用模运算和除法运算来获得值的原始位置。
生成的DataFrame有3列:第一列是值的等级(12 - > max,1 - > min),第二列是值的原始行的索引,第三列是值的原始列的索引。
希望它会有所帮助,如果不完全清楚,请告诉我。
答案 1 :(得分:1)
stack
您的数据框,然后是sort_values
ascending=False
,然后选择index.tolist()
data.stack().sort_values(ascending=False).index.tolist()