将列值与字典匹配

3
我有一个字典和一个数据框,就像下面的示例v和df一样。 我想搜索df中的项,并返回与字典值具有最大字段值相同数量的项。 在这种情况下,它将是第3项。 我想也许可以使用应用程序与lambda函数,或转置df。 我只是无法彻底理解它。 如果有人有一个巧妙的方法来做到这一点或任何提示,将不胜感激。
输入:
v={'size':1,'color':red}

df:

item size color
2    2    red
3    1    red

Output:
3

因为兼职重复,重新开放。 - jezrael
2个回答

2

创建一行 DataFrame 并与原始数据进行 merge

a = pd.DataFrame(v, index=[0]).merge(df)['item']
print (a)
0    3
Name: item, dtype: int64

另一种解决方案是使用query,但如果需要字典的字符串值,则需添加另一个"
v1 = {k: '"{}"'.format(v) if isinstance(v, str) else v for k, v in v.items()}
print (v1)
{'size': 1, 'color': '"red"'}

df = df.query(' & '.join(['{}=={}'.format(i,j) for i, j in v1.items()]))['item']
print (df)
1    3
Name: item, dtype: int64

输出结果可能有三种方式 - Series(具有多个值)、单个值或为空,因此创建了帮助函数:

def get_val(v):
    x = pd.DataFrame(v, index=[0]).merge(df)['item']
    if x.empty:
        return 'Not found'
    elif len(x) == 1:
        return x.values[0]
    else:
        return x.values.tolist()

print (get_val({'size':1,'color':'red'}))
3

print (get_val({'size':10,'color':'red'}))
Not found

print (get_val({'color':'red'}))
[2, 3]

2

另一种解决方案是使用字典而不是数据框:

v = {'size': 1, 'color': 'red'}

match_count = {}

fields = df.columns[1:]

for k, value in df.to_dict(orient='index').items():
    match_count[value['item']] = sum(value[i] == v[i] for i in fields & v.keys())

结果

print(match_count)
# {2: 1, 3: 2}

res = max(match_count.items(), key=lambda x: x[1])

print(res)
# (3, 2)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接