如何基于Pandas分组索引匹配获取对应中位数金额?
解决多层索引DataFrame的取值问题
嘿,针对你这个多层索引DataFrame的需求,其实有更直接高效的方法,不用绕弯子循环找count,我给你两种方案:
方案一:直接通过多层索引访问(推荐)
因为你的train_frame已经把['property', 'month', 'date', 'room']设为多层索引,Pandas的.loc方法完美支持直接传入索引元组来定位行,这是最简洁高效的方式。
假设你传入的匹配列表是target = [prop_val, month_val, date_val, room_val],只需要把它转成元组(或者直接用列表也可以,Pandas会自动识别),然后直接取值:
# 假设传入的目标匹配值是 ['BuildingA', 5, 20, 'Room102'] target = ['BuildingA', 5, 20, 'Room102'] # 直接通过多层索引定位对应的中位数金额 median_amount = train_frame.loc[tuple(target), 'amount'] # 因为你的DataFrame只有amount一列,也可以简化成: median_amount = train_frame.loc[tuple(target)]
注意:要保证传入的每个值的类型和索引层的类型完全匹配,比如month如果是整数类型,你就不能传字符串'5',必须传整数5,否则会找不到对应行。
方案二:基于你之前的思路优化(不推荐,仅作参考)
如果你还是想沿用把索引存入列表的思路,也可以通过找到匹配索引的位置,再用.iloc取值:
# 把所有多层索引转成列表 big_list = train_frame.index.tolist() # 目标匹配的索引元组 target_tuple = ('BuildingA', 5, 20, 'Room102') # 找到目标索引在列表中的位置 try: idx = big_list.index(target_tuple) # 通过位置获取对应的金额 median_amount = train_frame.iloc[idx]['amount'] except ValueError: # 处理找不到匹配项的情况 print("没有找到匹配的索引")
不过这种方法在数据量大的时候效率很低,因为list.index()是线性查找,远不如.loc的哈希查找快,所以更推荐方案一。
内容的提问来源于stack exchange,提问作者user11883303
相关产品推荐
相关产品推荐

