整个数据框架的最大索引?



我有几个数据帧,它们都具有相同的格式:

i |nameA |  A  | nameB |  B  | nameC |  C  | nameD |  D
-------------------------------------------------------
0 |  1   | 45  |   9   | 123 |  123  |  23 |   1   | 502
1 |  5   | 435 |   15  | 894 |  523  | 1.1 |   5   | 502
2 |  10  | 112 |   20  | 542 |  234  |  52 |   7   | 502
3 |  7   | 432 |   2   | 900 |  43   | 653 |   4   | 502            
4 |  8   | 854 |   6   | 234 |  853  |  50 |   3   | 502
5 |  9   | 231 |   80  | 435 |  95   |  56 |   9   | 502

我想找到最大值&A, B, C, D中的最小n个值,以及它们的索引,以便我可以找到0~3位整数的"名称"。

从上面的示例数据框架,如果我需要最多4个值,我想

(column, index, value, name):
(B, 3, 900, 2)
(B, 1, 894, 15)
(A, 4, 854, 8)
(C, 3, 653, 43)

,最小4应为:

(column, index, value, name):
(C, 1, 1.1, 523)
(C, 0, 23, 123)
(A, 0, 45, 1)
(C, 4, 50, 853)

不一定是这种格式

数据框实际上没有以任何方式排序,并且名称与值没有任何关联。

任何帮助都非常感激,谢谢。

编辑:填充示例数据框和结果。

由于没有提供完整的示例,这里有一个:

np.random.seed(0)
df = (pd.DataFrame(np.random.randint(0,100, size=(100, 8)),
columns=['nameA', 'A', 'nameB', 'B', 'nameC', 'C', 'nameD', 'D'])
.rename_axis('i')
.reset_index()
)
>>> df.head()
i  nameA   A  nameB   B  nameC   C  nameD   D
0  0     44  47     64  67     67   9     83  21
1  1     36  87     70  88     88  12     58  65
2  2     39  87     46  88     81  37     25  77
3  3     72   9     20  80     69  79     47  64
4  4     82  99     88  49     29  19     19  14

现在你可以重塑和loc4nlargest值每组:

(df.set_index('i')
.set_axis(pd.MultiIndex.from_frame(df.columns[1:].str.extract('(^name)?(.+)').fillna('value'),
names=[None, 'columns']
), axis=1)
.stack(level='columns')
.loc[lambda d: d.groupby('columns', group_keys=False)['value'].nlargest(4).index]
.reset_index()
)

输出:

i columns  name  value
0    4       A    82     99
1   96       A    12     97
2   69       A    87     96
3   13       A    64     95
4   49       B    51     99
5   14       B     3     98
6   56       B    20     97
7   89       B    18     97
8    9       C    14     99
9   11       C    20     99
10  61       C    98     97
11  78       C    12     96
12  96       D    26     99
13  15       D     2     98
14  68       D    74     98
15  73       D    79     98

您可以使用idxmaxidxmin来获取每列的最大值和最小值的索引(coli)。

df = pd.DataFrame({'i':[0,1,2],'nameA':[1,5,10],'A':[45,435,112]})
df.set_index('i',inplace = True)
df.A.idxmax()
1

最新更新