首页 > 编程问答 >如何通过MultiIndex查询MultiIndex并选择“最佳”行?

如何通过MultiIndex查询MultiIndex并选择“最佳”行?

时间:2024-08-03 05:06:46浏览次数:14  
标签:python pandas dataframe multi-index

假设我有一个 MultiIndex by MultiIndex DataFrame 类似于这里生成的:

import pandas as pd

data_frame_rows = pd.MultiIndex.from_arrays([[], [], []], names=("car", "engine", "wheels"))
data_frame_columns = pd.MultiIndex.from_arrays([[], [], []], names=("group", "subgroup", "details"))
data_frame = pd.DataFrame(index=data_frame_rows, columns=data_frame_columns)

for car in ("mustang", "corvette", "civic"):
    for engine in ("normal", "supercharged"):
        for wheels in ("normal", "wide"):
            data_frame.loc[(car, engine, wheels), ("cost", "", "money ($)")] = int(random() * 100)
            data_frame.loc[(car, engine, wheels), ("cost", "", "maintenance (minutes)")] = int(random() * 60)

            percent_win = random()
            recommended = percent_win >= 0.8
            data_frame.loc[(car, engine, wheels), ("race", "f1", "win %")] = percent_win
            data_frame.loc[(car, engine, wheels), ("race", "f1", "recommended")] = recommended

            percent_win = random()
            recommended = percent_win >= 0.8
            data_frame.loc[(car, engine, wheels), ("race", "indy", "win %")] = percent_win
            data_frame.loc[(car, engine, wheels), ("race", "indy", "recommended")] = recommended

            percent_win = random()
            recommended = percent_win >= 0.8
            data_frame.loc[(car, engine, wheels), ("race", "lemans", "win %")] = percent_win
            data_frame.loc[(car, engine, wheels), ("race", "lemans", "recommended")] = recommended

然后看起来像:

group                             cost                            race                                                        
subgroup                                                            f1                  indy                lemans            
details                      money ($) maintenance (minutes)     win % recommended     win % recommended     win % recommended
car      engine       wheels                                                                                                  
mustang  normal       normal       3.0                  33.0  0.664754       False  0.584689       False  0.629107       False
                      wide        39.0                  30.0  0.143568       False  0.339405       False  0.531536       False
         supercharged normal      65.0                  59.0  0.270161       False  0.682142       False  0.953301        True
                      wide        92.0                  12.0  0.403246       False  0.801241        True  0.991273        True
corvette normal       normal      72.0                  46.0  0.361436       False  0.981196        True  0.352499       False
                      wide        19.0                   2.0  0.303950       False  0.578942       False  0.802201        True
         supercharged normal      15.0                  29.0  0.148742       False  0.305060       False  0.144883       False
                      wide        59.0                  38.0  0.102707       False  0.364228       False  0.602490       False
civic    normal       normal      51.0                  14.0  0.726772       False  0.930073        True  0.218876       False
                      wide        66.0                   7.0  0.530214       False  0.051396       False  0.240695       False
         supercharged normal      55.0                  52.0  0.939180        True  0.614061       False  0.589519       False
                      wide        74.0                  28.0  0.595012       False  0.240609       False  0.539910       False

我现在想要找到在至少一场比赛中推荐特定汽车配置的所有行。如果在多场比赛中推荐特定的汽车,那么我想选择在任一比赛中获胜机会最高的配置。

我已阅读 多次,并且对于我的生活我无法弄清楚。

我尝试了类似的方法:

data_frame[(data_frame.loc[:,idx["race",:,"recommended"]]==True)]

但这似乎并没有过滤行,只是将其设置为 NaN 或 True

group                             cost                        race                                                 
subgroup                                                        f1              indy             lemans            
details                      money ($) maintenance (minutes) win % recommended win % recommended  win % recommended
car      engine       wheels                                                                                       
mustang  normal       normal       NaN                   NaN   NaN         NaN   NaN         NaN    NaN         NaN
                      wide         NaN                   NaN   NaN         NaN   NaN         NaN    NaN         NaN
         supercharged normal       NaN                   NaN   NaN         NaN   NaN         NaN    NaN        True
                      wide         NaN                   NaN   NaN         NaN   NaN        True    NaN        True
corvette normal       normal       NaN                   NaN   NaN         NaN   NaN        True    NaN         NaN
                      wide         NaN                   NaN   NaN         NaN   NaN         NaN    NaN        True
         supercharged normal       NaN                   NaN   NaN         NaN   NaN         NaN    NaN         NaN
                      wide         NaN                   NaN   NaN         NaN   NaN         NaN    NaN         NaN
civic    normal       normal       NaN                   NaN   NaN         NaN   NaN        True    NaN         NaN
                      wide         NaN                   NaN   NaN         NaN   NaN         NaN    NaN         NaN
         supercharged normal       NaN                   NaN   NaN        True   NaN         NaN    NaN         NaN
                      wide         NaN                   NaN   NaN         NaN   NaN         NaN    NaN         NaN

以下是如何使用 Pandas 中的多索引来实现这一点:

import pandas as pd

# ...(使用的数据框创建代码)...

# 布尔索引,查找至少有一场比赛推荐的汽车配置。
recommended_cars = data_frame[data_frame.loc[:, ('race', slice(None), 'recommended')].any(axis=1)]

# 从推荐的配置中,按“win %”的最大值找到每辆车的最佳配置。
def get_best_config(df):
    return df.loc[df[('race', df[('race', slice(None), 'win %')].idxmax(axis=1)[0])].name]

best_configs = recommended_cars.groupby(level=['car', 'engine']).apply(get_best_config)

print(best_configs)

说明:

  1. 查找推荐的汽车:
  2. data_frame.loc[:, ('race', slice(None), 'recommended')] 选择具有“race”作为第一个级别索引、“recommended”作为第三个级别索引的所有列,而第二个级别索引可以是任何内容( slice(None) )。
  3. .any(axis=1) 检查每一行是否至少有一个 True 值(即,至少有一场比赛推荐)。
  4. data_frame[...] 使用布尔索引来选择满足条件的行。

  5. 查找每辆车的最佳配置:

  6. groupby(level=['car', 'engine']) 按汽车和发动机类型对推荐的配置进行分组。
  7. apply(get_best_config) 对每个组应用 get_best_config 函数。
  8. get_best_config 函数内部:
    • df[('race', slice(None), 'win %')] 选择具有“win %”作为第三个级别索引的所有列。
    • idxmax(axis=1)[0] 查找每一行中“win %”最高值的列的索引(比赛类型)。
    • df.loc[...] 选择具有最大“win %”的行的索引。

这个代码将为你提供一个数据框,其中包含每种汽车和发动机组合的最佳推荐配置(如果存在)。

标签:python,pandas,dataframe,multi-index
From: 78827002

相关文章

  • python数据分析与可视化基础
    一、数据分析介绍:1.数据分析含义:数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,将它们加以汇总和理解并消化,以求最大化地开发数据的功能,发挥数据的作用。数据分析是为了提取有用信息和形成结论而对数据加以详细研究和概括总结的过程。数据分析的数学基础在20世纪早......
  • 为什么要设置 os.environ[“PYTHONHASHSEED“] = “0“,这样做具体会影响哪些随机值?
    ......
  • Python,Geopandas报错,AttributeError: The geopandas.dataset has been deprecated and
    Python版本3.9,Geopandas版本1.0.1问题描述:这是执行的代码,importpandasaspdimportgeopandasimportmatplotlib.pyplotaspltworld=geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))world.plot()plt.show()这是报错信息,Traceback(mo......
  • Python,Maskrcnn训练,cannot import name ‘saving‘ from ‘keras.engine‘ ,等问题集合
    Python版本=3.9,tensorflow=2.11.0,keras==2.11.0问题一、module'keras.engine'hasnoattribute'Layer'Traceback(mostrecentcalllast):File"C:\Users\Administrator\Desktop\20240801\代码\test.py",line16,in<module>......
  • 7-Python数据类型——列表和元组的详解(增删改查、索引、切片、步长、循环)
    一、列表1.1列表list有序且可变的容器,可以存放多个不同类型的元素列表就是专门用来记录多个同种属性的值列表:存储同一个类别的数据,方便操作字符串,不可变:即:创建好之后内部就无法修改【内置功能都是新创建一份数据】name="xiaochaun"data=name.upper()print(nam......
  • python中的 is 和 ==
    一前言环境:win10python3.10二is和isnot1比较对象的identityis和isnot是python的比较运算符,比较运算符除了这两个,还有下图中的这些is和isnot比较的是两个对象的是identityidentity是啥,内置函数id()返回的就是这个东西通过上面id函数的解释,现在知道,identi......
  • Python应用开发——30天学习Streamlit Python包进行APP的构建(23):构建多页面应用程序
    创建动态导航菜单通过st.navigation,可以轻松创建动态导航菜单。您可以在每次重新运行时更改传递给st.navigation的页面集,从而更改与之匹配的导航菜单。这是创建自定义、基于角色的导航菜单的便捷功能。本教程使用st.navigation和st.Page,它们是在Streamlit1.36.0版中......
  • Python数据结构第二天—循环链表、树、二叉搜索树
    双向链表之前学习的单向链表只能从头遍历到尾,过程是单向的,而双向链表既可以从头遍历到尾,也可以从尾遍历到头,它的过程是双向的。既然它是双向的,那么我们要实现一个双向链表,就需要在单向链表的基础上,给每一个结点增加一个向前的引用。双向链表的创建:"""我们要实现的是一......
  • Python学习笔记50:游戏篇之外星人入侵(十一)
    前言本篇文章接着之前的内容,继续对游戏功能进行优化,主要是优化游戏状态以及对应的处理。状态一个游戏包含多种状态,这个状态是一个可以很复杂也可以很简单的内容。条件所限,我们这个游戏的状态就比较简单:未开始游戏中暂停结束我们通过一个字段进行控制,并且将这个字段放置......
  • python——functools
    好的,我们再详细讲解functools模块的常用工具,包括每个API的语法和参数,并特别详细解释lru_cache的工作原理及其缓存机制。functools简介functools模块提供了许多高阶函数和工具,用于操作或返回其他函数,帮助我们更方便地进行函数式编程。1.partial函数partial函数用于固定......