python---之求每一行或每一列的最大值的索引(轴)

本文介绍 NumPy 中 a.argmax(axis=0) 方法的使用技巧,通过一个随机整数数组的例子展示了如何获取每列最大值的索引,并给出详细输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

a.argmax(axis=0)

array([1, 1, 0])

例子:

a = np.random.randint(50,size= (4,5))
print a
print a.argmax(axis=0)

output:

array:

[[34  7 11 35 47]
 [12 38  0  4 35]
 [32 11 46 21 25]
 [ 3 14 17 30 15]]
inde:
[0 1 2 0 0]
<think>我们有一个DataFrame,需要获取每列中最大的10个值对应索引(行标签)。 思路:对每一列,我们可以使用nlargest(10)来获取最大的10个值,然后获取这些值对应索引。 但是注意:每列最大的10个值对应索引可能是不同的,所以我们需要分别处理每一列。 步骤: 1. 遍历DataFrame的每一列(即按列操作)。 2. 对每一列,使用`nlargest(10)`方法获取最大的10个值,并得到它们的索引。 3. 将这些索引收集起来,可以放在一个新的DataFrame中,者放在一个字典中,其中键是列名,值是该列最大的10个值对应索引列表。 注意:由于可能存在重复值,我们直接使用索引即可,索引可以唯一标识行(即使行索引有重复,但通常索引是唯一的,如果用户设置的索引有重复,那么我们需要考虑如何处理,但这里我们直接使用索引即可)。 另外,也可以使用排序(sort_values)然后取前10个,但使用nlargest更直接。 示例代码: 假设df是我们的DataFrame。 我们可以这样: result = {} for col in df.columns: # 使用nlargest(10)获取该列最大的10个值,并提取它们的索引 top_10 = df[col].nlargest(10) # 获取索引并转换为列表 indices = top_10.index.tolist() result[col] = indices 这样result就是一个字典,键是列名,值是该列最大的10个值对应索引列表。 如果我们想要一个DataFrame,其中每一列是原始DataFrame的列,每一行对应列的前10个最大值索引(注意:不同列的前10个索引数量都是10,所以可以对齐),那么我们可以构建一个DataFrame: result_df = pd.DataFrame({col: df[col].nlargest(10).index.tolist() for col in df.columns}) 但是这样构建的DataFrame的每一列是一个列表(长度为10),每一行代表前10个最大值中的第几个(第一行是最大的,第二行是第二大的,...)。注意:这样每一列都是10个元素,所以可以形成10行的DataFrame,列名和原来一样。 但是,如果原始数据中某一列不足10个非NaN值,那么nlargest(10)会返回所有非NaN值(数量小于10),这样就会导致该列在结果DataFrame中的行数不足10行,而其他列有10行,这样构建DataFrame会出错(因为长度不一致)。因此,我们可能需要用NaN填充不足10行的部分,者使用列表并保持长度为10(不足则补NaNNone)。 另一种方式是构建一个以列名为键,索引列表为值的字典,然后不转换为DataFrame,直接输出字典。 根据需,用户要的是每列最大的10个值的索引,我们可以返回一个字典,者一个Series,者一个DataFrame。这里我们提供两种方式: 方式1:字典(推荐,因为每列的前10个索引可以独立,且不需要对齐) 方式2:DataFrame(要每列都恰好有10个值,如果有NaN,那么需要先处理NaN,者填充) 我们这里采用方式1,因为更通用。 但是注意:如果某一列的非NaN值不足10个,那么nlargest(10)会返回所有非NaN值(不会报错),所以对应索引列表长度就会小于10。 示例: 引用中并没有直接给出每列取前10个索引的方法,但我们可以根据已有知识实现。 另外,引用[2]提到了获取索引最大值所在的行,使用的是`df.index.argmax()`,但这是获取整个DataFrame中最大索引(即索引列的最大值)所在的行,并不是我们要的。引用[4]提到了查找列的值最大的行,但也是针对单列的最大值,不是前10个。 因此,我们按照上述思路实现。 代码示例: 假设有DataFrame如下: import pandas as pd data = {'A': [1, 3, 5, 7, 9, 2, 4, 6, 8, 10, 11], 'B': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110]} df = pd.DataFrame(data) 我们想要每列最大的10个值的索引(注意这个例子有11行,所以每列取前10个)。 实现: 方式1(字典): result_dict = {} for column in df.columns: # 获取该列最大的10个值,并取出索引 top_10 = df[column].nlargest(10) result_dict[column] = top_10.index.tolist() 方式2(DataFrame,如果每列都有至少10个非NaN值): # 创建一个新的DataFrame,列名相同,行数为10 result_df = pd.DataFrame({col: df[col].nlargest(10).index.tolist() for col in df.columns}) 如果某一列的非NaN值不足10个,那么我们可以用None填充至10个: result_data = {} for col in df.columns: top_10 = df[col].nlargest(10) indices = top_10.index.tolist() if len(indices) < 10: indices += [None] * (10 - len(indices)) result_data[col] = indices result_df = pd.DataFrame(result_data) 但是,填充None可能会引入歧义,所以还是推荐使用字典。 根据用户问题,他要的是“每列数据中最大10个值的索引”,我们返回一个字典应该是最直接的。 因此,我们提供字典形式的解决方案。 注意:如果用户希望索引按照从大到小对应的值排序(即第一个索引最大值,第二个是次大值,...),那么nlargest(10)返回的Series的索引就是按照这个顺序排列的,所以直接取索引列表即可。 另外,如果存在重复值,nlargest(10)会返回所有重复值,但取前10个(如果有多个相同的最大值,那么它们都会在结果中,但总共10个,所以可能包含多个相同的值对应索引)。如果用户不希望重复,那么需要去重?但问题没有要,所以按原样。 示例代码: 我们将使用一个示例DataFrame来演示。 但是,用户的问题中并没有给出具体的DataFrame,所以我们给出通用的代码。 最终答案: 我们可以这样写代码: top_10_indices_per_column = {} for col in df.columns: # 使用nlargest(10)获取该列最大的10个值,然后获取索引 top_10_indices_per_column[col] = df[col].nlargest(10).index.tolist() 然后top_10_indices_per_column就是我们要的结果。 如果用户想要一个DataFrame,我们可以转换,但这里按照要,我们返回字典。 但是,用户的问题是如何“获取”,所以我们提供代码。 另外,如果用户希望以不同的形式输出(比如每列的前10个索引放在一个列表里),我们可以调整。 但是,问题只要获取索引,所以我们给出上述方法。 注意:如果列中有NaN,nlargest(10)会自动忽略NaN,所以不用担心NaN的影响。 下面我们用一个具体的例子演示: 创建DataFrame: import pandas as pd import numpy as np df = pd.DataFrame({ 'A': [1, 3, 5, 7, 9, 2, 4, 6, 8, 10, 11], 'B': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110], 'C': [np.nan, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 第一行是NaN }) 对列'A':最大的10个值应该是11,10,9,8,7,6,5,4,3,2(注意有11个值,所以去掉1),对应索引是[10,9,4,8,3,7,2,6,1,5](注意索引从0开始,所以11在索引10的位置,10在索引9的位置,9在索引4的位置,以此类推) 对列'B':最大的10个值应该是110,100,90,80,70,60,50,40,30,20,对应索引是[10,9,8,7,6,5,4,3,1]? 注意有11个值,所以最小的10(索引0)被排除,所以索引是[10,9,8,7,6,5,4,3,2,1](因为110在10,100在9,90在8,...,20在1) 对列'C':第一行是NaN,所以被忽略,最大的10个值应该是10,9,8,7,6,5,4,3,2,1,对应索引是[10,9,8,7,6,5,4,3,2,1](因为NaN被排除,所以有10个非NaN值) 但是注意:nlargest(10)返回的顺序是从大到小,所以索引也是按照这个顺序排列。 验证代码: top_10_indices_per_column = {} for col in df.columns: top_10_indices_per_column[col] = df[col].nlargest(10).index.tolist() 输出: A: [10, 9, 4, 8, 3, 7, 2, 6, 1, 5] # 注意:11(索引10)最大,然后10(索引9),然后9(索引4),然后8(索引8),然后7(索引3),然后6(索引7),然后5(索引2),然后4(索引6),然后3(索引1),然后2(索引5) # 但是注意,原始数据中A列:索引0:1, 1:3, 2:5, 3:7, 4:9, 5:2, 6:4, 7:6, 8:8, 9:10, 10:11 # 排序后:11,10,9,8,7,6,5,4,3,2 -> 索引:10,9,4,8,3,7,2,6,1,5 -> 正确。 B: [10,9,8,7,6,5,4,3,2,1] # 注意B列的值:索引0:10,1:20,...,10:110 -> 从大到小:110,100,90,...,20 -> 索引10,9,8,...,1 -> 正确。 C: [10,9,8,7,6,5,4,3,2,1] # 因为NaN被排除,所以非NaN值从10到1,从大到小就是10,9,...,1,对应索引是10,9,...,1 -> 正确。 因此,代码正确。 但是,注意索引的排序:nlargest(10)返回的Series的索引是按照值从大到小排列的,所以我们的索引列表也是从最大值索引开始。 如果用户需要的是索引值(而不是位置),那么即使索引不是0到n-1的整数,而是字符串者其他类型,这个方法同样适用,因为nlargest返回的是原始索引。 例如,如果索引是字符串: df.index = ['a','b','c','d','e','f','g','h','i','j','k'] 那么结果中的索引就是这些字符串。 因此,这个方法通用。 总结:使用循环每列,对每列使用nlargest(10)并获取索引列表。 代码: result = {col: df[col].nlargest(10).index.tolist() for col in df.columns} 我们也可以写成字典推导式。 现在,我们根据用户的问题,给出完整代码示例。</think>在 Pandas 中获取 DataFrame 每列最大的 10 个值对应索引,可以通过以下方法实现: ### 解决方案 ```python import pandas as pd # 示例 DataFrame data = {'A': [15, 20, 35, 40, 10, 25], 'B': [100, 90, 120, 80, 110, 95], 'C': [7, 12, 9, 15, 11, 8]} df = pd.DataFrame(data) # 获取每列最大10个值的索引 (字典格式) top10_indices_dict = {} for col in df.columns: top10_indices_dict[col] = df[col].nlargest(10).index.tolist() # 获取每列最大10个值的索引 (DataFrame格式) top10_indices_df = pd.DataFrame({ col: df[col].nlargest(10).index.tolist() for col in df.columns }) ``` ### 关键步骤说明 1. **遍历每列**:使用 `for col in df.columns` 循环处理每列数据 2. **提取最大 N 个值**:`df[col].nlargest(10)` 获取指定列最大的 10 个值(包含值和索引) 3. **获取索引列表**: - `.index` 获取这些值对应索引 - `.tolist()` 将索引转换为 Python 列表 4. **结果存储**: - **字典格式**:`{列名: [索引1, 索引2, ..., 索引10]}` - **DataFrame 格式**:每列表示原始 DataFrame 的列名,每行对应排序位置(第1行是最大值索引) ### 结果示例 原始 DataFrame: ``` A B C 0 15 100 7 1 20 90 12 2 35 120 9 3 40 80 15 4 10 110 11 5 25 95 8 ``` 输出结果 (字典格式): ```python { 'A': [3, 2, 5, 1, 0, 4], # 40(3), 35(2), 25(5), 20(1), 15(0), 10(4) 'B': [2, 4, 0, 5, 1, 3], # 120(2), 110(4), 100(0), 95(5), 90(1), 80(3) 'C': [3, 1, 4, 2, 5, 0] # 15(3), 12(1), 11(4), 9(2), 8(5), 7(0) } ``` 输出结果 (DataFrame 格式): ``` A B C 0 3 2 3 # 各列最大值索引 1 2 4 1 # 各列第二大值索引 2 5 0 4 3 1 5 2 4 0 1 5 5 4 3 0 ``` ### 注意事项 1. **不足 10 个值的情况**:如果某列非空值少于 10 个,`nlargest()` 会返回所有非空值的索引 2. **索引含义**:返回的是原始 DataFrame 的行索引(可能是整数、字符串等标签) 3. **性能优化**:对于大型 DataFrame,该方法时间复杂度为 $O(n\log k)$($n$ 为行数,$k=10$),效率较高 ### 相关问题 1. 如何获取每列最小值对应索引而非最大值? 2. 当存在重复最大值时,如何获取所有重复值的索引? 3. 如何同时获取最大 10 个值及其索引而不仅仅是索引? 4. 在包含 NaN 值的列中,`nlargest()` 会如何处理这些特殊值? 5. 如何将结果中的索引映射回原始 DataFrame 获取完整数据行?[^2] [^1]: 通过 `nlargest()` 方法结合索引提取实现高效操作 [^2]: 可使用 `df.loc[index_list]` 根据索引列表获取完整数据行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值