创建仅包含最大公共组配对的字典

时间:2019-03-05 20:45:09

标签: python dictionary

我想创建一个最大共有配对的字典-一个“协议”表。找到协议时,可以将代码缩短一点吗?到目前为止,我真的不喜欢找到最大数量,然后根据数量进行匹配以找到“协议”。

import pandas as pd
from collections import defaultdict


df = pd.DataFrame({
    'id': ['A', 'A', 'B', 'B', 'B', 'B'],
    'value': [1, 1, 2, 2, 1, 2]})

df = df.groupby(["id","value"]).size().reset_index().rename(columns={0: "count"})
df["max_rank"] = df.groupby(["id"])["count"].transform("max")==df["count"]
df = df.loc[(df["max_rank"]==True)]

d = defaultdict(list)

for idx, row in df.iterrows():
    d[row['id']].append(row['value'])

d = [{k: v} for k, v in d.items()]

d

输出: [{'A':[1]},{'B':[2]}]

1 个答案:

答案 0 :(得分:1)

您可以构建一个将每个id映射到值列表的字典,然后使用collections.Counter.most_common方法获取每个id的最常用值:

from collections import Counter
d = {'id': ['A', 'A', 'B', 'B', 'B', 'B'], 'value': [1, 1, 2, 2, 1, 2]}
mapping = {}
for k, v in zip(d['id'], d['value']):
    mapping.setdefault(k, []).append(v)
print({k: Counter(l).most_common(1)[0][0] for k, l in mapping.items()})

这将输出:

{'A': 1, 'B': 2}