2015-11-16 3 views
1

У меня есть dataframe, который выглядит следующим образом:Поиск значения в dataframe, который содержит список

id points 
a [c,v,b,n] 
b [] 
c [x,a] 
.... 

и словарь (я также как dataframe):

{'a': ['j','c'], 
'b': [p,r,q] 
'c': [n,k,l,x,a] 
....} 

Я хочу поиск, если ключ словаря содержится, - это точки кадра данных, а затем удалить элементы из словарных точек, которые не совпадают в словаре. Ожидаемый результат:

id points 
a [c] 
b [] 
c [x,a] 

Я попробовал этот

for key,point in my_dict.items(): 
    if df['points'].str.contains(point).any() 

, но я получаю TypeError: unhashable type: 'list'

Я попытался преобразования dataframe в словарь, но тогда время поиска слишком много, потому что мне нужно больше для петель. Любые предложения по улучшению кода или структуры данных?

Редактировать

Другое представление данных:

id points 
a [c,v,b,n] 
b [] 
c [x,a] 
.... 

и

points 
j,c 
p,r,q 
n,k,l,x,a 

ответ

1

Вы можете позвонить apply и конвертировать значения Dict в набор может преобразовать intersection к список:

In [15]: 
d={'a': ['j','c'], 
'b': ['p','r','q'], 
'c': ['n','k','l','x','a']} 
d 

Out[15]: 
{'a': ['j', 'c'], 'b': ['p', 'r', 'q'], 'c': ['n', 'k', 'l', 'x', 'a']} 

In [17]: 
df['points'] = df.apply(lambda row: list(set(d[row['id']]).intersection(row['points'])), axis=1) 
df 

Out[17]: 
    id points 
0 a  [c] 
1 b  [] 
2 c [a, x] 

Что касается причин возникновения ошибки, вы пытаетесь вызвать метод .str в серии, которая является списком dtype, они не являются строками.

+0

Я получаю ключевую ошибку. Есть ли другое решение, использующее два блока данных, которые я добавил в свой пост? – mnmbs

+0

вы можете отправлять исходные входные данные и весь код для воспроизведения ваших dfs и того, что вы пробовали, что вызвало ошибку. – EdChum

+0

Извините, поскольку я дважды проверял перед публикацией, я нашел свою ошибку. Это было очень полезно! Благодаря! – mnmbs

Смежные вопросы