2017-03-16 13 views
0

に追加しない場合、私は2つのデータフレーム持って、確認してください。私がしたい、マスター列はリストから文字列が含まれている場合、それは、マスタ文字列から部分文字列を削除し、新しい列

df1= 
    A  
0 Black Prada zebra leather Large 
1 green Gucci striped Canvas small 
2 blue Prada Monogram calf leather XL 

df2= 
    color pattern material  size 
0 black zebra  leather  small 
1 green striped canvas  xl 
2 yellow checkered calf leather medium 
3 orange monogram 
4 white plain 
5   pinstripe 

をdf2の列とdf1(不均一な大文字小文字と空白を制御する)を比較し、一致するものがあればdf1の新しい列に入力してAから削除します。牛革 "と誤解を招くことはありません。だから、結果はわずかに残っ非マッチした部分文字列のようになります。

df3= 
    A   color pattern material  size 
0 Prada Large black zebra  leather  NaN 
1 Gucci  green striped canvas  small 
2 Prada  blue  Monogram calf leather XL 

私はループに使用して試してみましたが、私のデータセットは非常に大きく、それが完全にパンダを利用していないような気がします。私も含まれていて、成功していないisinを試してみました。 .extractとdf2カラムを正規表現に変換する唯一の方法はありますか?ありがとう!

+0

例df1の最初の行にエラーがありますか? 'プラダラージ'?私はあなたのデータで何を得ているのか分かりません。 – ryanjdillon

+0

混乱を避けるため、希望の出力の名前をdf3に変更しました。しかし、df3は本当にdf1であり、列が追加され、その列に追加された文字列は列 "A"の文字列から削除されます – thaneofcawdor

+0

データにはどのように欠損値が含まれていますか? – ryanjdillon

答えて

0

を更新しましたあなたは(私は今、以下のようsearchを呼んでいる)df1からdf2の列を検索する方法をランク付けすることができますように聞こえます。

search文字列内の単語の最大パーセンテージがdf2の列の単語と一致するかどうかを確認します。必要なしきい値を満たしている場合は削除されます。

私はそれをテストしていますが、動作していますが、正規表現マッチングで少し再生する必要があるかもしれません。

import pandas 

def perc_match(src, s): 
    '''Return percentage of words in s found in src''' 
    # http://stackoverflow.com/a/26985301/943773 
    import re 
    s = ' | '.join([r'\b{}\b'.format(x) for x in s.split()]) 
    r = re.compile(s, flags=re.I | re.X) 

    return len(r.findall(src))/len(src) 


search = ['Black Prada zebra leather Large', 
      'green Gucci striped Canvas small', 
      'blue Prada Monogram calf leather XL'] 

d2 = {'color':['black', 'green', 'yellow', 'orange', 'white',''], 
     'pattern':['zebra', 'striped', 'checkered', 'monogram', 'plain', 
       'pinstripe'], 
     'material':['leather', 'canvas', 'calf leather','','',''], 
     'size':['small', 'xl', 'medium','','','']} 

df2 = pandas.DataFrame(d2) 

# Strip whitespace and make all lower case 
strip_lower = lambda x: x.strip().lower() 
search = list(map(strip_lower, search)) 
df2 = df2.applymap(strip_lower) 

# Combine all columns to single string for each row 
df2['full_str'] = df2.apply(lambda row: ' '.join(row), axis=1) 

# Min percent matching 
min_thresh = 0.1 

# Calculate the percentage match for each row of dataframe 
rm_ind = list() 
for i in range(len(search)): 
    s = search[i] 
    # If you want you could save these `perc_matches` for later 
    perc_matches = df2['full_str'].apply(perc_match, args=(s,)) 
    # Mark for removal if above threshold 
    if perc_matches.max() > min_thresh: 
     rm_ind.append(i) 

# Remove indices from `search` 
for i in rm_ind: 
    del search[i] 
+0

df1の列名にdf2との関係がないため、df2に存在しない列名である 'A'にキーエラーが発生するため、機能しません。 – thaneofcawdor

+0

df1の再作成が正しくありません。 「ブランド」は知られていません(一致する部分文字列を削除する理由の一部です。他の既知の属性が削除されると、「ブランド」は推測できます)。 df1は一連の文字列であり、df2はdf1を検索したい既知の属性のいくつかのリストのDataFrameです。 – thaneofcawdor

+0

各行/文字列に一貫性のある構造がある場合、列に 'df1'を解析しない理由はありますか? – ryanjdillon

関連する問題