2017-01-14 13 views
1

Предположим, у меня есть два фрейма данных, как показано ниже.Как я могу сопоставлять значения из разных фреймов данных на основе некоторых условий или функций с помощью панд?

raw_data = { 
    'name': ['Jason love you', 'Molly hope wish care', 'happy birthday', 'dog cat', 'tiger legend bird'], 
    'nationality': ['USA', 'USA', 'France', 'UK', 'UK'] 
} 

raw_data_2 = { 
    'name_2': ['Jason you', 'Molly care wist', 'hapy birthday', 'dog', 'tiger bird'], 
    'nationality': ['USA', 'USA', 'France', 'UK', 'JK'], 
    'code': ['a', 'b','c','d','e'] 
} 

df1 = pd.DataFrame(raw_data, columns = ['name', 'nationality']) 
df2 = pd.DataFrame(raw_data_2, columns = ['name_2', 'nationality', 'code']) 

Что я хочу сделать, это сопоставление двух данных, основанных на некоторых условиях. Условием здесь является то, что

  1. если существует имя из raw_data_2 которое является подмножеством значений (имя) от raw_data_1, когда эти два имени разделяются пробелом, и
  2. национальность должна быть такой же.

Для облегчения понимания, вот пример: от raw_data_2, 'Jason You'.split(' ') = ['Jason', 'You'], так что это подмножество 'Jason Love You'.split(' ') = ['Jason', 'Love', 'You']. Но 'Molly care wist'.split(' ') НЕ является подмножеством 'Molly care wish'.split(' '), потому что последний не полностью покрывает бывшее (отлично). 'tiger bird'.split(' ') от raw_data_2 является подмножеством 'tiger legend bird'.split(' '), но их национальность отличается.

Если мы отвечаем вышеуказанным условиям, тогда, наконец, я хочу присвоить значение code с raw_data_2. Таким образом, желаемый результат (давайте просто взять code с) было бы как:

'a'(matched), Nan(unmatched), Nan(unmatched), 'd', Nan(unmatched) 

Как я могу сделать это с помощью панд? Думаю, это не так просто, как функция isin или функция map.

+0

Играют ли буква случае какую-то роль? – MaxU

+0

В этом случае я не хочу классифицировать нижний/верхний регистр. Давайте просто проигнорируем. – ritos

+1

Вы сравниваете строки за строкой? Или все возможные комбинации? – piRSquared

ответ

1

Использование <= оператора для проверки подмножества

name = df1.name.str.split().apply(set) 
name2 = df2.name_2.str.split().apply(set) 
cond1 = name2 <= name 
cond2 = df1.nationality == df2.nationality 

pd.concat([df1, df2], axis=1, keys=['df1', 'df2']).loc[cond1 & cond2] 

       df1     df2     
      name nationality  name_2 nationality code 
0 Jason love you   USA Jason you   USA a 
3   dog cat   UK  dog   UK d 
+0

На самом деле, мой пример кажется немного неправильным. Df1 намного больше (длиннее), чем df2, поэтому два кадра данных должны иметь разную длину. И текущий пример был так легко сравнивать по строке-строке (каждая строка похожа на друг друга), но на самом деле она должна быть в другом порядке. Это будет несколько сложнее, чем раньше. – ritos

+0

Мой вопрос кажется немного расплывчатым. My purposse должен был сопоставлять значения (в данном случае это условие подмножества) на основе словаря (df2). Поэтому, если есть большой набор данных (df1), я хотел бы сопоставить все имена, которые могут быть подмножеством некоторого значения из словаря. Таким образом, естественно, что порядок и длина обоих блоков данных не будут равны (он может быть равен, но обычно это не является общим). – ritos

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

  • Нет связанных вопросов^_^