2017-07-18 2 views
0

次のPythonコードを持つと、pd.mergeを使用しようとしていましたが、キー列が同一である必要があります。 SQLと似たようなことをしようとすると、categories.Patternを持つdf.Bの "like"演算子と結合します。列をパターンとして使用し、左側のデータフレームの列を含む2つのパンダデータフレームをマージするにはどうすればよいですか?

UPDATEより良いデータ例です。

import pandas as pd 
import numpy as np 
df = pd.DataFrame([[1, 'Gas Station'], [2, 'Servicenter'], [5, 'Bakery good bread'], [58, 'Fresh market MIA'], [76, 'Auto Liberty aa1121']], columns=['A','B']) 

    Out[12]: 
    A B 
0 1 Gas Station 
1 2 Servicenter 
2 5 Bakery good bread 
3 58 Fresh market MIA 
4 76 Auto Liberty aa1121 

categories = pd.DataFrame([['Gasoline', 'Gas Station'], ['Gasoline', 'Servicenter'], ['Food', 'Bakery'], ['Food', 'Fresh market'], ['Insurance', 'Auto Liberty']], columns=['Category','Pattern']) 

    Out[13]: 
    Category Pattern 
0 Gasoline Gas Station 
1 Gasoline Servicenter 
2 Food Bakery 
3 Food Fresh market 
4 Insurance Auto Liberty 

期待される結果は次のとおりです。

Out[14]: 
    A B     Category 
0 1 Gas Station   Gasoline 
1 2 Servicenter   Gasoline 
2 5 Bakery good bread Food 
3 58 Fresh market MIA Food 
4 58 Auto Liberty aa1121 Insurance 

がご提案/フィードバックを感謝しています。ルックアップテーブルとしてデータフレームとパラメータ

次の完全な例意志を使用して、新しい値を返します

def lookup_table(value, df): 
    """ 

    :param value: value to find the dataframe 
    :param df: dataframe which constains the lookup table 
    :return: 
     A String representing a the data found 
    """ 
    # Variable Initialization for non found entry in list 
    out = None 
    list_items = df['Pattern'].tolist() 
    for item in list_items: 
     if item in value: 
      out = item 
      break 
    return out 

:ような新しい機能を作成することによって、

+0

の可能性のある重複した[ファジーマッチがPythonのパンダと合併行うには、それは可能ですか?](https://stackoverflow.com/questions/13636848/is-it-possible-to-do -fuzzy-match-merge-with-python-pandas) –

+0

結果が – piRSquared

+0

であると期待していただければ幸いです。ファジーマッチプロポーザルはここには当てはまらないようです。私はcategories.Pattern値を使用して、通常はstr.containsのように使用しますが、categories.Categoryの値が一致すればそれを返します。 –

答えて

1

予想されるデータフレームを表示します。

import pandas as pd 

df = pd.DataFrame([[1, 'Gas Station'], [2, 'Servicenter'], [5, 'Bakery good bread'], [58, 'Fresh market MIA'], [76, 'Auto Liberty aa1121']], columns=['A','B']) 
categories = pd.DataFrame([['Gasoline', 'Gas Station'], ['Gasoline', 'Servicenter'], ['Food', 'Bakery'], ['Food', 'Fresh market'], ['Insurance', 'Auto Liberty']], columns=['Category','Pattern']) 

def lookup_table(value, df): 
    """ 

    :param value: value to find the dataframe 
    :param df: dataframe which constains the lookup table 
    :return: 
     A String representing a the data found 
    """ 
    # Variable Initialization for non found entry in list 
    out = None 
    list_items = df['Pattern'].tolist() 
    for item in list_items: 
     if item in value: 
      out = item 
      break 
    return out 


df['Pattern'] = df['B'].apply(lambda x: lookup_table(x, categories)) 
final = pd.merge(df, categories) 

Expected output

0
df['lower'] = df['B'].str.extract(r'([A-z0-9]+)') 
categories['lower'] = categories['pattern'].str.extract(r'([A-z0-9]+)') 
final = pd.merge(df, categories) 
+0

私が使用したいのはcategoriesです。正規表現の一部としてのパターン値またはdf.Bで見つかったものと一致するワイルドカードとの組み合わせ。一致する場合は、categories.Category値を返します。 –

+0

@ LuisGonzalez 3つのカテゴリしかありませんか? –

+0

カテゴリdataframeは参照テーブルであり、カテゴリやパターンを含めて時間ベースで異なる場合があります。 –

関連する問題