如何基于指定优先级规则从DataFrame中提取最优type与value键值对
实现方案(推荐)
无需中转字典,直接通过排序+分组取首行即可实现规则,逻辑清晰且不会丢失同type的多值场景:
- 给
type列映射优先级权重,优先级越高数值越大 - 按分组键、优先级、value降序排序,每个分组的第一行即为符合规则的最优结果
- 分组取首行输出结果即可
import pandas as pd # 定义type优先级映射 type_prio = {'t': 3, 'o': 2, 'f': 1} merged_df['type_prio'] = merged_df['type'].map(type_prio) # 排序:先按分组键,再按type优先级降序,同优先级按value降序 sorted_df = merged_df.sort_values( by=['name', 'time', 'type_prio', 'value'], ascending=[True, True, False, False] ) # 每个(name, time)分组取第一行即为所需结果 res = sorted_df.groupby(['name', 'time'], as_index=False).first()[['name', 'time', 'type', 'value']]
基于你现有字典结果的处理方案
如果要基于你已经生成的含字典的grp对象处理,可以用自定义函数提取最优键值对:
注意:你之前生成字典的逻辑存在缺陷,如果同一个
type在同一个分组下出现多个value,转字典时会被后面的value覆盖,无法正确执行「同type取最大value」的规则,因此更推荐使用第一种方案。
def extract_best(kv_dict): # 按优先级顺序遍历type,找到第一个存在的type即可返回 for t in ['t', 'o', 'f']: if t in kv_dict: return pd.Series([t, kv_dict[t]], index=['type', 'value']) return pd.Series([None, None], index=['type', 'value']) # 应用函数生成结果 grp[['type', 'value']] = grp.iloc[:, -1].apply(extract_best) res = grp[['name', 'time', 'type', 'value']]
内容的提问来源于stack exchange,提问作者K_Raikar
相关产品推荐
相关产品推荐

