【问题标题】:How do we get an optimum key value pair from a list of dictionaries in a dataframe column based on certain rules?我们如何根据某些规则从数据框列中的字典列表中获取最佳键值对?
【发布时间】:2021-11-15 20:43:54
【问题描述】:

我有以下数据框:

不同的“类型”可以同时出现在“时间”,但只需要根据以下条件获取“类型”和“值”即可:

  • 优先级1:类型重要性为t>o>f
  • 优先级 2:值列中要考虑的最高值

我尝试过使用 groupby 和字典:

grp = merged_df.groupby(['name','time'],as_index=False)[['type','value']].apply(lambda x: dict(x.values.tolist()))

这给出了这样的输出:

有没有什么办法可以根据上面两条规则得到最优的键值对,这样输出就可以了:

以上是我尝试过的一种方法,这就是为什么问题是关于字典中的最佳键值对的原因。但是,任何其他更优雅的方法也可以。

最终结果应该是:

【问题讨论】:

    标签: python pandas dictionary group-by key-value


    【解决方案1】:

    以下答案可能不是那么优雅,因为:1. 它需要您事先创建一个字典,在其中映射优先级 1 (t > o > f) 和 2. 绕过使用字典但应该完成工作:

    首先,根据优先级1创建一个字典,并使用它创建一个基于'type'的新映射列:

    prio_dic = {'t':'3', 'o':'2', 'f':'1'}
    data["coded_type"] = data["type"].map(prio_dic)
    

    最后,首先使用新列 'coded_type' 对值进行排序,然后使用新列 'value' 对值进行排序,像您所做的那样按 'name' 和 'time' 分组,并获取每个组的第一个元素:

    res = data.sort_values(['coded_type', 'value', ], ascending=False).groupby(['name', 'time'], as_index=False).first()
    

    不幸的是,这需要删除新列的额外步骤:

    res.drop('coded_type', axis=1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      • 2020-06-26
      • 1970-01-01
      相关资源
      最近更新 更多