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