我有一个dict和一个数据框,如下面的例子v和df。我想搜索df中的项目并返回具有与dict中的值相同的最大字段值数量的项目。在这种情况下,它将是第3项。我在考虑使用带有lambda函数的应用,或者转置df。我只是无法安静地绕过它。如果有人有一个光滑的方式来做这个或任何提示,他们非常感激。
输入:
v={'size':1,'color':red}
df:
item size color
2 2 red
3 1 red
Output:
3
答案 0 :(得分:2)
使用原始内容创建一行DataFrame
和merge
:
a = pd.DataFrame(v, index=[0]).merge(df)['item']
print (a)
0 3
Name: item, dtype: int64
使用query
的另一个解决方案,但如果需要dict
的字符串值,请添加另一个"
:
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
在输出中有3种方式 - 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]
答案 1 :(得分: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)