假设我有一个
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)
说明:
- 查找推荐的汽车:
-
data_frame.loc[:, ('race', slice(None), 'recommended')]
选择具有“race”作为第一个级别索引、“recommended”作为第三个级别索引的所有列,而第二个级别索引可以是任何内容(slice(None)
)。 -
.any(axis=1)
检查每一行是否至少有一个True
值(即,至少有一场比赛推荐)。 -
data_frame[...]
使用布尔索引来选择满足条件的行。 -
查找每辆车的最佳配置:
-
groupby(level=['car', 'engine'])
按汽车和发动机类型对推荐的配置进行分组。 -
apply(get_best_config)
对每个组应用get_best_config
函数。 -
在
get_best_config
函数内部:-
df[('race', slice(None), 'win %')]
选择具有“win %”作为第三个级别索引的所有列。 -
idxmax(axis=1)[0]
查找每一行中“win %”最高值的列的索引(比赛类型)。 -
df.loc[...]
选择具有最大“win %”的行的索引。
-
这个代码将为你提供一个数据框,其中包含每种汽车和发动机组合的最佳推荐配置(如果存在)。
标签:python,pandas,dataframe,multi-index From: 78827002