2017-12-11 14 views
-1

나는 특히 데이터가 누락 된 값을 처리하기 위해 사전 처리하려고합니다. 단어 목록과 텍스트 데이터가있는 두 개의 열이 있습니다. 목록에서 단어가 두 개의 텍스트 열 중 하나 이상있는 경우, 나는조건에서 목록에서 단어 누락 값을 채우기

import pandas as pd 
a=['coffee', 'milk', 'sugar'] 
test=pd.DataFrame({'col':['missing', 'missing', 'missing'], 
        'text1': ['i drink tea', 'i drink coffee', 'i drink whiskey'], 
        'text2': ['i drink juice', 'i drink nothing', 'i drink milk'] 
        }) 

는 그래서 dataframe 모습 단어와 fillna 적용의 결과로 "실종"한 열 "COL"(함께 실종 채우기) "실종"

Out[19]: 
     col   text1   text2 
0 missing  i drink tea i drink juice 
1 missing i drink coffee i drink nothing 
2 missing i drink whiskey  i drink milk 

나는 그런 코드는 100 000 행과 목록 "a"는이 작업을 완료 주변 870초 소요 2000 요소로 루프를

for word in a: 
    test.loc[(test["col"]=='missing') & ((test["text1"].str.count(word)>0) 
    | (test['text2'].str.count(word)>0)), "col"]=word 

을 적용 내놓았다. 거대한 데이터 프레임에서 더 빠르게 만들 수있는 솔루션이 있습니까? 사전에 감사

+1

당신이 여기'pandas'를 사용하고 있습니까? 여기서 필요없는 태그 몇 개를 제거하고 그 중 하나를 추가 할 수도 있습니다. [mcve]를 제공하십시오. –

+0

누락 된 값을 나타내는 열은 무엇입니까? – Tanu

+0

fillna ("missing")을 적용한 결과 "col"열이 "누락되었습니다" – Yury

답변

0

제안 :

  • .str.count 대신 .str.contains 사용할 수 있습니까?
  • fillna('missing')은 왜 제공됩니까? pd.isnull(test["col"])은 더 빨리 작동합니다. test["col"]=='missing'
  • 테스트를 사용하여 누락 된 필드가 모두 채워 졌는지 확인할 수도 있습니다.

그래서 이런 식으로 뭔가로 요약 할 수 있습니다

def fill_missing(original_df, column_name, replacements, inplace=True): 
    df = original_df if inplace else original_df.copy() 
    for word in replacements: 
     empty = pd.isnull(df[column_name]) 
     if not empty.any(): 
      return df 
     contained = (df.loc[empty, "text1"].str.contains(word)) | (df.loc[empty, 'text2'].str.contains(word)) 
     df.loc[contained[contained].index, column_name] = word 
    return df 
+0

"count"를 "contains"로 변경하면 약간의 시간을 절약 할 수 있습니다. pd.isnull (test [ "col"])을 시도하도록 코드를 다시 작성하겠습니다. 감사합니다. – Yury

+0

다시 한번 감사드립니다! 귀하의 코드는 문제를 처리하는데 실제 변화를 일으키며 거의 2 배 더 빠르게 작동합니다 !!! – Yury