2016-10-18 4 views
1

Я выполняю сопоставление (вид нечеткого соответствия) между названиями компаний двух фреймов данных. Для этого сначала я выполняю полное слияние между всеми названиями компаний, где совпадает исходный алфавит. Это означает, что все компании, начинающиеся с «А», будут сопоставляться со всеми компаниями, начиная с «А» в другой структуре данных. Это делается следующим образом:Содержит функцию в Pandas

df1['df1_Start'] = df1['company1'].astype(str).str.slice(0,2) 
df2['df2_Start'] = df2['company2'].astype(str).str.slice(0,2) 
Merge = pd.merge(df1,df2, left_on='df1_Start',right_on='df2_Start') 

Теперь я хочу, чтобы все строки из FullMerge, где компания в df1 содержит компанию в df2. Это связано с тем, что компании в df1 имеют удлиненные имена.

Merge1=Merge[Merge['company1'].str.contains(Merge['company2'].str)] 

Это не работает для меня. Как выполнить эту задачу? Также, пожалуйста, предложите, какие другие способы можно использовать для соответствия названиям компаний. Потому что компании могут быть одинаковыми в двух кадрах данных, но не написаны точно так же.

ответ

1

Я думаю, что вам нужно | с join для генерации всех значений, разделенных | (или в regex) для str.contains:

Merge1=Merge[FullMerge['company1'].str.contains("|".join(Merge['company2'].tolist())] 
+0

Спасибо! Как я могу изменить это, так что компания1 должна содержать только компанию2 в начале, а не где-то посередине? Потому что выше дает мне несколько ложных срабатываний. – ComplexData

+0

Мне кажется, вам нужно '^' - начало регулярного выражения string -'Merge1 = Merge [FullMerge ['company1']. Str.contains ("|" .join (Merge ['^' + 'company2']. Tolist())] ' – jezrael

Смежные вопросы