2017-12-11 24 views
-1

私は特に欠損値を扱うデータを前処理しようとしています。 私は単語のリストとテキストデータを持つ2つの列を持っています。リストから単語を2つのテキスト列の少なくとも一つである場合、私は言葉条件のリストからの単語の欠損値の入力

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'] 
        }) 

で行方不明埋めるので、データフレームは次のようになり、列「colが」(fillnaを適用した結果として、「行方不明」あり私は100 000行と、リスト内の2000の要素でループ

を適用するようなコードを思い付いた)

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 

の「欠落して」「」それは仕事を終えるために周りに870秒かかります。 巨大なデータフレームで高速化するソリューションはありますか? 事前のおかげで

+1

あなたがここに 'pandas'を使用していますか?ここで不要なタグをいくつか削除して、そのタグを追加して、[mcve]を提供するようにしてください。 –

+0

欠けている値を示す列はどれですか? – Tanu

+0

fillna( "missing")を適用した結果、列 "col"に "missing"が発生しました – Yury

答えて

0

ヒント:代わりに.str.contains.str.countを使用する理由

  • 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

関連する問題