pandas“2D rank”数据帧为(row,col)索引元组

时间:2016-06-02 04:51:03

标签: pandas numpy dataframe matrix rank

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()等一些尴尬的序列,但想要更好的东西。

我搜索了一堆,但没有找到适用于此的评论。我应该将行或列一起捕捉并从那里排名吗?还是有更直接的路径?

2 个答案:

答案 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()