【问题标题】:Get pairs of keys (n0, _), (n1, _) with maximum values for each key pair (n0, a), (n0, b) in a dictionary获取字典中每个键对 (n0, a), (n0, b) 的最大值的键对 (n0, _), (n1, _)
【发布时间】:2016-05-15 03:37:36
【问题描述】:

假设我们有一个这样的字典:

os_stats = {
    ('USA', 'Mac OS X'): 1,
    ('Mexico', 'iOS'): 3,
    ('USA', 'Windows XP'): 2, 
    ('Germany', 'Windows 7'): 9,
    ('Germany', 'Windows XP'): 7, 
    ('Mexico', 'Windows XP'): 2,
    ...
}

我想要这样的输出:

os_preferences = {
     ('Mexico', 'iOS'): 3, 
     ('USA', 'Windows XP'): 2,
     ('Germany', 'Windows 7'): 9, 
      ...
}

仅显示每个国家/地区的最高值。 我怎样才能做到这一点?

【问题讨论】:

  • 你能试着写代码吗?
  • 我目前正在尝试,但ATM没有解决方案
  • 您确定数据结构是表示数据的最佳方式吗?使用嵌套字典可能更方便,这样您就可以轻松访问与同一国家/地区相关的键值组。

标签: python python-2.7 data-analysis bigdata


【解决方案1】:

这个dict理解做到了:

{country:{os:count} for (country,os),count in sorted(os_stats.items(), key=lambda rec:rec[1])}

第一部分是这样的:

sorted(os_stats.items(), key=lambda rec:rec[1])

产生:

[(('USA', 'Mac OS X'), 1),
 (('Mexico', 'Windows XP'), 2),
 (('USA', 'Windows XP'), 2),
 (('Mexico', 'iOS'), 3),
 (('Germany', 'Windows XP'), 7),
 (('Germany', 'Windows 7'), 9)]

请注意,它是按计数字段的升序排序的 (rec[1])。

其余的只是将数据按摩到单个dict,其效果是通过覆盖较小的值来丢弃较小的值,因为它与较大的值一起使用。

【讨论】:

  • 您必须将该理解的输出翻译成所需的形式,如果您的理解的输出是d,那么所需的输出将是{(p[0], p[1].keys()[0]): p[1].values()[0] for p in d.items()}
【解决方案2】:

pandas 只需 3 行即可完成工作:

import pandas as pd
df = pd.DataFrame(os_stats, index=['index']).transpose()
os_preferences = df[df['index'] == df.groupby(level=[0])['index'].transform(max)].to_dict()['index']

# output:
# {('Mexico', 'iOS'): 3, 
#  ('USA', 'Windows XP'): 2, 
#  ('Germany', 'Windows 7'): 9}

【讨论】:

  • 这完全让 OP 大吃一惊。为熊猫 +1。
  • 其实我仅限于纯python。这就是我不使用熊猫的原因。
猜你喜欢
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
  • 2021-09-13
  • 2017-03-12
  • 2020-08-26
  • 1970-01-01
  • 2022-08-12
  • 1970-01-01
相关资源
最近更新 更多