2017-03-20 3 views
0

큰 판다 데이터 프레임에서 많은 수의 단어를 찾고 있는데 성능에 문제가 있습니다. 팬더 데이터 프레임의 열 문자열에서 이진 검색 방법이 있습니까?팬더 데이터 프레임의 바이너리 검색?

는 지금 내 코드는 다음과 같다 :

names = pd.DataFrame(data=['one', 'two', 'three', 'four'], index=range(0, 4), columns=['Name']) 
sentence = 'There are two trees in the street.' 

for word in word_tokenize(sentence): 
    # Search for each word in all the names 
    new_names = names[names['Name'].str.startswith(word)] 
    # then do some operations on the names 

그러나 내가 names[names['Name'].str.startswith(word)]에 대한 더 나은 성능을 필요로하고 내가 '이름'열이 이진 검색 방법을 찾아야한다고 생각.

+0

? 더 구체적인 방법을 제시해야합니다. 시도한 일부 코드로 샘플 DataFrame을 제공하는 것은 먼 길을 갈 것입니다. –

+0

@TedPetrou 감사합니다! 나는 조금 질문을 바꾸었다. – AmirAhmad

+0

답변을 제공하기에 충분한 세부 정보가 아직 없습니다. 'iterrows' 밑에서 무슨 일이 일어나고 있는지. 일반적으로 'iterrows'는 사용하지 않는 것이 좋습니다. 더 많은 정보가 담긴 샘플 데이터 프레임은 먼 길을 갈 것입니다. –

답변

1

이 방법에는 최소한 두 가지 문제가 있습니다. 첫째, 캐시 될 수 있지만 모든 단어에 대해 names['Name'].str.startswith(word)이 계산됩니다. 둘째, startswith()은 단어 "the"가 "There"와 일치합니다.

# calculate startword only once. 
startword = names.apply(lambda row: row['Name'].split(" ", 1)[0]) 

for word in word_tokenize(sentence): 
    # also, match by the full word only 
    new_names = names[startword == word] 

그것은 더 빨리 startword 인덱스 인 경우가 될 수 있습니다 : 코드로 변환,이 방법이 변경 될 수 있습니다

names.index = startword 
for word in word_tokenize(sentence): 
    # also, match by the full word only 
    new_names = names.loc[word] 
정확하게 당신이 시도 무엇
+0

고맙습니다! 이 .loc []은 시작 단어가있는 여러 행이있을 때 하나의 행만있을 때 데이터 프레임을 반환하지만 다르게 처리해야하는 다른 데이터 형식을 반환합니다. 거기에 대한 해결책이 있습니까? – AmirAhmad

+0

@AmirAhmad는'names.loc [word]'대신'names.loc [[word]]'를 사용합니다. – Marat

관련 문제