Сопоставить значения столбца с dict - PullRequest
0 голосов
/ 25 мая 2018

У меня есть dict и датафрейм, как в примерах v и df ниже.Я хочу найти элементы в df и вернуть элемент, который имеет максимальное количество значений полей, общих со значениями в dict.В этом случае это будет пункт 3. Я подумал, может быть, использовать apply с лямбда-функцией или транспонировать df.Я просто не могу успокоиться.Если у кого-то есть отличный способ сделать это или какие-либо советы, они очень ценятся.

input:

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

df:

item size color
2    2    red
3    1    red

Output:
3

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Альтернативным решением является работа со словарями вместо фреймов данных:

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)
0 голосов
/ 25 мая 2018

Создайте одну строку 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...