Как использовать каждую строку в DataFrame для фильтрации запроса - PullRequest
0 голосов
/ 01 ноября 2019

У меня проблема, которую я не могу решить.

У меня есть датафрейм Pandas, подобный этому:

    LastName FirstName Goals
0    Messi    Lionel    10

1   Donovan   Landon    7

2   Hazard     Eden     5

И мне нужно сделать запросдля Teradata, чтобы получить данные из другой таблицы, фильтруя результаты по Фамилии и Фамилии всех людей в DataFrame, например:

"Select * from Table1 where (LastName= 'Messi' and FirstName='Lionel) or (LastName='Donovan' and FirstName='Landon') or (LastName='Hazard' and FirstName='Eden')"

Я пытался с некоторым циклом, но я не могу это сделать, взять каждую строку и добавить оператор или. У кого-нибудь есть идея для ее решения?

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 01 ноября 2019

Если вы хотите сравнить значения нескольких столбцов в таблице со значениями в другой таблице, вы можете сделать что-то вроде этого:

SELECT *
FROM Table1
WHERE (LastName, FirstName) IN (
  SELECT lastname, firstname
  FROM <some_table>
)

Я не уверен, как работает DataFrame,но если вы можете получить доступ к полям (lastname, firstname) из своего результирующего набора DataFrame в некоторой разновидности SQL, попробуйте вставить это в конструкцию IN ().

SQL Fiddle

0 голосов
/ 01 ноября 2019

Эту проблему можно решить, применив маски.

Предположим, учитывая df:

условие 1: (LastName = 'Messi' и FirstName = 'Lionel')

cond1 = df['LastName'].eq('Messi') & df['FirstName'].eq('Lionel')

condition2: (LastName = 'Donovan' и FirstName = 'Landon')

cond2 = df['LastName'].eq('Donovan') & df['FirstName'].eq('Landon')

Так же, как и другие имена.

Затем используйте loc для выбора:

df.loc[cond1 | cond2, :]

Вы можете добавить столько условий, сколько хотите. Надеюсь, это поможет.

0 голосов
/ 01 ноября 2019

Мы обычно можем сделать merge

cond=pd.DataFrame({'FirstName':['Lionel','Landon','Eden'], 'LastName':['Messi','Donovan','Hazard']})
df=df.merge(cond, how='inner')
...