获取字典中每个键对 (n0, a), (n0, b) 的最大值的键对 (n0, _), (n1, _)
Get pairs of keys (n0, _), (n1, _) with maximum values for each key pair (n0, a), (n0, b) in a dictionary
假设我们有一个像这样的字典:
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,
...
}
其中仅显示每个国家/地区的最高值。
我怎样才能做到这一点?
这个听写理解做到了:
{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
,其效果是通过覆盖较大的值来丢弃较小的值。
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}
假设我们有一个像这样的字典:
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,
...
}
其中仅显示每个国家/地区的最高值。 我怎样才能做到这一点?
这个听写理解做到了:
{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
,其效果是通过覆盖较大的值来丢弃较小的值。
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}