整个数据帧的最大索引?
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】:您可以使用idxmax
和idxmin
来获取每列的最大值和最小值的索引(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
【讨论】:
以上是关于整个数据帧的最大索引?的主要内容,如果未能解决你的问题,请参考以下文章