2017-11-20 4 views
0

df Bのラベルをdf Aの列のサブストリングに基づいて取得する必要があります。ループを使用せずにこれを行う方法はサブストリングに基づいて名前を導出する

質問

ありますか?

データフレームA:

original string: 

1. test1(arizona)  
2. NJtest2    

データフレームB:

keyword   Label 

1. test1   First Cycle Test 
2. test2   Second Cycle Test 

出力:

Original   Target 

1. test1(arizona) First Cycle Test 
2. NJtest2   Second Cycle Test 
+0

は 'str.extract'と' merge'を使用してください。 –

+0

私は、データフレームにsandipsデータがあることは確かではありませんが、それは私が推測する答えは変わりません。 –

答えて

1

使用str.extract + merge

df1 
       Col 
0 test1(arizona) 
1   NJtest2 

df2 
    keyword    Label 
0 test1 First Cycle Test 
1 test2 Second Cycle Test 
p = '(?P<Key>.*(?P<keyword>{}).*)'.format('|'.join(df2.keyword)) 

df1.Col.str.extract(p, expand=True)\ 
      .merge(df2).drop('keyword', 1) 

       Key    Label 
0 test1(arizona) First Cycle Test 
1   NJtest2 Second Cycle Test 

正規表現パターンは、キーワードだけでなく、マージが無痛なる完全文字列を抽出します。

+0

ありがとうございます。私のような初心者にとっては、Wenのものと比べると少し複雑です。しかし、私はこれも好きで、将来もそれを保つ。 –

+0

@sandipsanyal私はこれが速くなければならないと思っています。 –

+0

@sandipsanyalあなたが使用するソリューションはどちらにしても[受け入れ可能とマークしてください](https://stackoverflow.com/help/someone-answers)です。あなたは1つしか受け入れることができません。ありがとう。 –

1

fuzzywuzzy + apply

df1 = pd.DataFrame({'col1': ['test1(arizona)', 'NJtest2']}) 
df2 = pd.DataFrame({'keyword': ['test1', 'test2'],'col2':['s1','s2']}) 
from fuzzywuzzy import process 
df2['New']=df2.keyword.apply(lambda x : [process.extract(x, df1.col1, limit=1)][0][0][0]) 
df2 
Out[133]: 
    col2 keyword    New 
0 s1 test1 test1(arizona) 
1 s2 test2   NJtest2 
+0

ありがとう。これはまさに私が必要としていたようです。クール。 –

+0

@sandipsanyal yw〜:-) – Wen

+0

温泉、これは時間がかかっていましたが、coldspeedによって提案されたものは本当に速いです。それを見てください。御時間ありがとうございます。 –

0

私はここで少し混乱しています。キーワード列を元の文字列に置き換えるだけの場合は、そして、これは十分なはずです:

df1 = pd.DataFrame({'original string': ['test1(arizona)', 'NJtest2']}) 
df2 = pd.DataFrame({'keyword': ['test1', 'test2','test3'] 
        ,'label':['First Cycle Test','Second Cycle Test','Third Cycle Test']}) 

def func(x): 
    find = [i for i in df1['original string'].tolist() if x in i] 
    if find: 
     return find[0] 
    else: 
     return "None" 

df2.keyword = df2.keyword.apply(func) 

df2 = df2.rename(columns=dict(keyword='Orginal',label='Target')) 

戻り値:

  Orginal    Target 
0 test1(arizona) First Cycle Test 
1   NJtest2 Second Cycle Test 
2   None Third Cycle Test 
関連する問題