将列值与dict匹配

时间:2018-05-25 05:20:27

标签: python python-2.7 pandas

我有一个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

2 个答案:

答案 0 :(得分:2)

使用原始内容创建一行DataFramemerge

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)