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')
ありがとうございました! 問題は私が間違ったマッチをするリスクを冒すことができないため、正確に見つからない場合にNaNを割り当てるために質問を編集しました。 – Reupiey
@Reupiey、編集を参照してください – Vaishali