Как выбрать результат сопоставления из фрейма данных в Pandas?

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Я пытаюсь поработать над выбором строки в фрейме данных с помощью pandas, но почему-то я не смог найти аналогичный пример моего случая. Решение должно быть простым, но я немного застрял.

  1. Существует два фрейма данных kg_df :
     source   edge     target
0   Jack     bought   apple     
  

и mylist :

     Unnamed            URL                        Length     Match Text
0   0           http://example.com/Alice             5        Alice
1   1           http://example.com/Finn              4        Finn
2   2           http://example.com/Jack              4        Jack
  

Приведенные выше данные — это просто пример (один случай). Данные в фреймах данных разные, каждый раз, когда я генерирую новые данные.

  1. Я хочу выбрать строку из mylist , используя значение из kg_df (т.Е. Совпадения Jack в обоих фреймах данных), но я хотел бы выполнять разные операции, если только совпадения есть между двумя фреймами данных, потому что иногда совпадений нет (приведенный выше случай имеет совпадения, потому что Jack отображается в обоих фреймах данных).
 obj = kg_df['source'].values[0]
objhit = mylist[mylist['Match Text'] == obj]
if len(objhit) == 1:
    objURI = objhit ['URL']
    object1 = URIref(objURI[2])
  

Итак, я проверяю len == 1 , но у меня возникли проблемы с получением object1. Приведенный выше код работает только потому, что я указываю номер строки ( objURI[2] ). Но, конечно, я не знаю, найден ли результат objhit [1] или [99]. Как я могу получить object1 правильно, не зная номера строки?

Большое спасибо!

Комментарии:

1. пожалуйста, добавьте больше разъяснений!

2. Я думаю, вы проверяете, равны ли списки, вместо того, чтобы проверять, имеют ли они общие элементы

3. извините, @Anurag Dhadse, если вы не понимаете мою проблему. Но я также не знаю, чего вы не understand…so Я не могу объяснить это лучше, если вы не укажете, какая часть непонятна. Приведенный ниже Василь Йорданов сбит с толку, но, по крайней мере, дал мне ответ для работы.

4. @Phineas. Спасибо за ваш комментарий, но есть ли разница между ними? Что это должно означать для решения моей проблемы? Есть предложения по рефакторингу моего кода? Приветствия

5. Когда два списка равны, ВСЕ их элементы одинаковы. Я понимаю, что вам нужно только найти общие элементы, а не если списки равны

Ответ №1:

Я в замешательстве… почему бы вам сначала не объединить обе таблицы, чтобы найти общие элементы, а затем применить маску так, как вы хотите?

 pd.merge(df1, df2, left_on='source', right_on='Match Text', how='inner')
  

Комментарии:

1. Извините за путаницу. Но никаких проблем. Это работает хорошо. Я не думал о слиянии. Большое спасибо. Я могу немного подождать, если есть другие приятные способы решить мою проблему.

Ответ №2:

Этого можно достичь с помощью dataframe.merge, где он покажет _merge результат как оба, если результат найден в обоих фреймах данных.

 comparison_df = df.merge(df1, indicator=True, how='outer', left_on='source', right_on='Match Text')
print(comparison_df[(comparison_df['_merge']=='both')].URL)
  

Этот код предоставит вам поле URL из datafram2.

Вывод: 0 http://example.com/Jack

Комментарии:

1. Спасибо. Это работает. Это похоже на @Vasil Yordanov, который идет первым.