整个数据帧的最大索引?

Posted

技术标签:

【中文标题】整个数据帧的最大索引?【英文标题】:nlargest index for entire dataframe? 【发布时间】:2021-11-29 11:47:46 【问题描述】:

我有几个数据框,格式都一样:

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)

不一定是这种格式。

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

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

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

【问题讨论】:

你能提供一个真正完整(非截断)的例子吗?和匹配的输出 欢迎来到 SO,阅读 minimal reproducible example 和 How to Ask 【参考方案1】:

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

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

现在您可以重塑和loc 每组 4 个nlargest 值:

(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

【讨论】:

您好,感谢您的回答!我只需要最上面的 n,所以我将最后一位更改为 .nlargest(n, 'value')。像奇迹一样工作【参考方案2】:

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

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

【讨论】:

以上是关于整个数据帧的最大索引?的主要内容,如果未能解决你的问题,请参考以下文章

查找熊猫索引数据帧的最小值和最大值

获取具有相应索引值的每日数据帧的每月最大值

重新索引 MultiIndex 数据帧的特定级别

合并具有不同索引的两个数据帧,同时使用一行代码保留主数据帧的索引

用字典映射数据帧的特定索引

Pandas 获取具有复合索引的数据帧的行号