2017-12-23 20 views
1

長い用語集があり、節に用語集が含まれているかどうかを確認したいと思います。以下のように:Pandas - 別の列の値に列ラベルが存在するかどうかをチェックして列を更新する

>>> glossary = ['phrase 1', 'phrase 2', 'phrase 3'] 
>>> glossary 
['phrase 1', 'phrase 2', 'phrase 3'] 

>>> df= pd.DataFrame(['This is a phrase 1 and phrase 2', 'phrase 1', 
'phrase 3', 'phrase 1 & phrase 2. phrase 3 as well'],columns=['text']) 
>>> df 
           text 
0  This is a phrase 1 and phrase 2 
1        phrase 1 
2        phrase 3 
3 phrase 1 & phrase 2. phrase 3 as well 

は、以下のようにそれを連結:

        text phrase 1 phrase 2 phrase 3 
0  This is a phrase 1 and phrase 2  NaN  NaN  NaN 
1        phrase 1  NaN  NaN  NaN 
2        phrase 3  NaN  NaN  NaN 
3 phrase 1 & phrase 2. phrase 3 as well  NaN  NaN  NaN 

私はテキスト列と比較して、用語集は、テキストと0であれば1を更新する用語集列ごとに達成したいですもしそうでなければ、この場合は

        text phrase 1 phrase 2 phrase 3 
0  This is a phrase 1 and phrase 2  1  1  0 
1        phrase 1  1  0  0 
2        phrase 3  0  0  1 
3 phrase 1 & phrase 2. phrase 3 as well  1  1  1 

どうすればよいですか?私のデータフレームでは、用語集の列は約3000列なので、各行の対応するテキストを比較するキーとして列ラベルに基づいて論理を一般化したいと考えています。

あなたが 0,1データフレームのため intにキャストで str.containsconcatでリストの内包表記を使用することができます

答えて

2

L = [df['text'].str.contains(x) for x in glossary] 
df1 = pd.concat(L, axis=1, keys=glossary).astype(int) 
print (df1) 
    phrase 1 phrase 2 phrase 3 
0   1   1   0 
1   1   0   0 
2   0   0   1 
3   1   1   1 

そして元にjoin

df = df.join(df1) 
print (df) 
            text phrase 1 phrase 2 phrase 3 
0  This is a phrase 1 and phrase 2   1   1   0 
1        phrase 1   1   0   0 
2        phrase 3   0   0   1 
3 phrase 1 & phrase 2. phrase 3 as well   1   1   1 
関連する問題