2017-01-23 17 views
1

は、私は2つのデータフレーム、main_dfあります検索文字列値

| header_1 
0 | value_1 
1 | value_2 
2 | value_3 
3 | value_1 

ルックアップデータフレームlookup_df

| header_1 | header_2 
0 | value_1 | lookup_value_1 
1 | value_2 | lookup_value_2 
2 | value_3 | lookup_value_3 
3 | value_4 | lookup_value_4 

main_dfの値が一意ではありません。 `lookup_df 'の値はユニークです。

main dfの新しい列に、対応するlookup_valueからlookup_dfを入力するだけです。

.merge,.join,.mapおよび.lookupを含むさまざまなアプローチを試みました。

main_df = pd.merge(main_df, lookup_df, how='inner', on=['header_1']) 

私が探しています結果は次のとおりです。

| header_1 | header_2 
0 | value_1 | lookup_value_1 
1 | value_2 | lookup_value_2 
2 | value_3 | lookup_value_3 
3 | value_1 | lookup_value_1 
+0

あるマップ(lookup_df.set_index( 'header_1')[」:そうが好き。 header_2 ']) ' – jezrael

+0

おそらくあなたは左マージしたいですか? – EdChum

+0

@jezrael私はこれを試しましたが、InvalidIndexError:一意にインデックス付けされたインデックスオブジェクトでのみ有効なインデックスを作成しました。エラーが発生しました。これは、私の参照値は一意ではありません。 – joshi123

答えて

1

あなたはmapSeriesで使用することができます。

main_df['header_2'] = main_df['header_1'].map(lookup_df.set_index('header_1')['header_2']) 
print (main_df) 
    header_1  header_2 
0 value_1 lookup_value_1 
1 value_2 lookup_value_2 
2 value_3 lookup_value_3 
3 value_1 lookup_value_1 

またはより高速なビットが変換されSeriesto_dict

main_df['header_2'] = main_df['header_1'].map(lookup_df.set_index('header_1')['header_2'] 
                 .to_dict()) 
print (main_df) 
    header_1  header_2 
0 value_1 lookup_value_1 
1 value_2 lookup_value_2 
2 value_3 lookup_value_3 
3 value_1 lookup_value_1 

タイミング

#[400000 rows x 1 columns] 
main_df = pd.concat([main_df]*100000).reset_index(drop=True) 

In [139]: %timeit pd.merge(main_df, lookup_df, how='left', on=['header_1']) 
10 loops, best of 3: 73.1 ms per loop 

In [140]: %timeit main_df['header_1'].map(lookup_df.set_index('header_1')['header_2']) 
10 loops, best of 3: 35.7 ms per loop 

In [141]: %timeit main_df['header_1'].map(lookup_df.set_index('header_1')['header_2'].to_dict()) 
10 loops, best of 3: 35.1 ms per loop 

EDIT:あなたはlookup_dfの列header_1の一意の値が必要

、一つの可能​​な解決策がdrop_duplicatesです:

print (lookup_df) 
    header_1  header_2 
0 value_1 lookup_value_1 
1 value_2 lookup_value_2 
2 value_3 lookup_value_3 
3 value_1 lookup_value_4 

#keep first value, default parameter keep='first' 
lookup_df = lookup_df.drop_duplicates(['header_1']) 
print (lookup_df) 
    header_1  header_2 
0 value_1 lookup_value_1 
1 value_2 lookup_value_2 
2 value_3 lookup_value_3 

#keep last value 
lookup_df1 = lookup_df.drop_duplicates(['header_1'], keep='last') 
print (lookup_df1) 
    header_1  header_2 
0 value_1 lookup_value_1 
1 value_2 lookup_value_2 
2 value_3 lookup_value_3 
+0

一意の 'lookup_df'を作成して回答を編集します。確認してください。 – jezrael

+0

は 'drop_duplicates'コードをテストしました。 – joshi123

0

あなたはせずにマージを行う必要があります'how'キーワード。

main_df = pd.DataFrame([{'header_1': 'value_1'},{'header_1': 'value_2'},{'header_1': 'value_3'},{'header_1': 'value_1'}]) 

lookup_df = pd.DataFrame([{'header_1':'value_1', 'header_2':'lookup_value_1'}, {'header_1':'value_2', 'header_2':'lookup_value_2'}, {'header_1':'value_3', 'header_2':'lookup_value_3'}, {'header_1':'value_4', 'header_2':'lookup_value_4'}]) 

main_df = pd.merge(main_df, lookup_df, on='header_1') 

出力私はあなたが `main_df [ 'header_2'] = main_df [ 'header_1']を必要だと思う

header_1  header_2 
0 value_1 lookup_value_1 
1 value_1 lookup_value_1 
2 value_2 lookup_value_2 
3 value_3 lookup_value_3