Многократная проверка условий и фильтрация между несколькими кадрами - PullRequest
0 голосов
/ 29 июня 2018

У меня есть два кадра данных, и я пытаюсь использовать один кадр данных в качестве фильтра df, а другой - тот, который фильтруется. Вот как выглядят два кадра данных:

df #(filtering)
   phrase1   date1
0  cat       2012-03-04    
1  tree      2015-05-02    
2  snail     2002-08-27 
3  dog       2004-02-27 

df1 #(being filtered)
   id       phrase2        date2
0  abc12    cat nip        2003-03-04  
1  def34    baobab tree    2009-05-02    
2  ghi56    lazy dog       2011-08-27 
3  jkl78    poor snail     2014-08-27 
4  mno90    fat cat        2008-08-27 

Я пытаюсь реализовать некоторую логику, где:

  • если какая-либо из строк в столбце phase1 кадра данных df совпадает с любой из строк в столбце phase2 кадра данных df1, И , если date1 в кадре данных df предшествует date2 в кадре данных df1:

    - drop слово, которое соответствует df1['phrase2']

  • , если любая из строк в столбце phase1 кадра данных df соответствует любой из строк в столбце phase2 кадра данных df1, И , если date1 в кадре данных df идет после date2 в кадре данных df1:

    - сохранить слово, которое соответствует df1['phrase2']

Хотя я не могу понять, как это сделать. Я попытался поиграться с np.where и соединить два условия с оператором & (например, np.where((condition1)&(condition2),'something','somethingelse'), но это продолжает отталкивать меня от сложности. Пожалуйста, помогите ..

Ожидаемый результат:

df1 
   id       phrase2        date2
0  abc12    cat nip        2003-03-04  
1  def34    baobab tree    2009-05-02 
2  ghi56    lazy           2011-08-27  
3  jkl78    poor           2014-08-27   
4  mno90    fat cat        2008-08-27 
#occurrences of dog and snail are gone because date1 dates came before date2 dates 
#for those particular words.

1 Ответ

0 голосов
/ 29 июня 2018

Использование:

#create dict for map if one word phrase
d = df.set_index('phrase1')['date1'].to_dict()

#if splitted strings like in original df
#d = {c: b for a, b in zip(df['phrase1'], df['date1']) for c in a.split()}
#print (d)

#join togther for list of tuples
zipped = zip(df1['phrase2'], df1['date2'])
#max Timestamp contant
mt = pd.Timestamp.max
#nested list comprehension with filtering
a = [' '.join([y for y in a.split() if not (d.get(y, mt) < b and y in d)]) for a, b in zipped]
print (a)
['cat nip', 'baobab tree', 'lazy', 'poor', 'fat cat']

df1['phrase2'] = a
print (df1)
      id      phrase2      date2
0  abc12      cat nip 2003-03-04
1  def34  baobab tree 2009-05-02
2  ghi56         lazy 2011-08-27
3  jkl78         poor 2014-08-27
4  mno90      fat cat 2008-08-27
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...