2017-03-09 11 views
2

私は2つのデータフレームdf1とdf2を持っているとしましょう。 df1の特定の列の値にdf2の特定の列に文字列が含まれている場合は、df1の一部の列をdf1に追加したい場合はNaNを追加します。パンダ:データフレームの値に別のデータフレームの文字列が含まれている場合は、列を追加してください

小さな例:

import pandas as pd 
df1 = pd.DataFrame({'col': ['abc', 'def', 'abg', 'xyz']}) 
df2 = pd.DataFrame({'col1': ['ab', 'ef'], 'col2': ['match1', 'match2'], 'col3': [1, 2]}) 

df1: 
   col 
0  abc 
1  def 
2  abg 
3 xyz 

df2: 

  col1    col2 col3 
0   ab  match1  1 
1   ef  match2  2 

私がしたい:

  col col2_match col3_match 
0  abc  match1   1 
1  def  match2   2 
2  abg  match1   1 
3 xyz   NaN   NaN 

私は汚いとunefficientな方法でそれを行うために管理しますが、私の場合のDF1に100K行のように含まれており、それが永遠に取ります...

ありがとうございます!

EDIT

ダーティビットが、比較的迅速に行う仕事を取得しますが(私はまだ...しかし賢い方法が存在すると考えて):

import pandas as pd 
import numpy as np 


df1 = pd.DataFrame({'col': ['abc', 'def', 'abg']}) 
df2 = pd.DataFrame({'col1': ['ab', 'ef'], 
        'col2': ['match1', 'match2'], 
        'col3': [1, 2]}) 


def return_nan(tup): 
    return(np.nan if len(tup[0]) == 0 else tup[0][0]) 


def get_indexes_match(l1, l2): 
    return([return_nan(np.where([x in e for x in l2])) for e in l1]) 


def merge(df1, df2, left_on, right_on): 
    df1.loc[:, 'idx'] = get_indexes_match(df1[left_on].values, 
              df2[right_on].values) 
    df2.loc[:, 'idx'] = np.arange(len(df2)) 
    return(pd.merge(df1, df2, how='left', on='idx')) 


merge(df1, df2, left_on='col', right_on='col1') 

答えて

0

はあなたがPythonのdifflibモジュールを使用することができますこの

import difflib 
difflib.get_close_matches 
df1.col = df1.col.map(lambda x: difflib.get_close_matches(x, df2.col1)[0]) 

のようなあいまい一致はだから今、あなたのDF1は

です
col 
0 ab 
1 ef 
2 ab 

df1を変更しない場合は、df3と呼ぶことができます。

今あなたがマージされたデータフレームが

col col2 col3 
0 ab match1 1 
1 ab match1 1 
2 ef match2 2 

などのEDITに見える

merged = df1.merge(df2, left_on = 'col', right_on = 'col1', how = 'outer').drop('col1', axis = 1) 

をマージすることができます、あなただけのラムダに条件を置く必要がある与えられた新しい例のように一致なしの場合 を

df1.col = df1.col.map(lambda x: difflib.get_close_matches(x, df2.col1)[0] if difflib.get_close_matches(x, df2.col1) else x) 

今すぐマージしたら

col col2 col3 
0 ab match1 1 
1 ab match1 1 
2 ef match2 2 
3 xyz NaN  NaN 
+0

ありがとうございました! 問題は私が間違ったマッチをするリスクを冒すことができないため、正確に見つからない場合にNaNを割り当てるために質問を編集しました。 – Reupiey

+0

@Reupiey、編集を参照してください – Vaishali

関連する問題