Как совместить два или более dataframe в один, которые получаются в ходе выполнения цикла?

Имеем два фрейма данных, в каждом из них есть общий столбец (INN в данном случае). Требуется вытащить строки из второго фрейма (df2), значение столбца INN которых совпадет со значением из первого фрейма (df1). В ходе выполнения цикла получается 2 или более фрейма данных. Для дальнейшей работы их следует как-то объединить в один, но никак не удается. Подскажите, пожалуйста, правильный способ их объединения. Благодарю!

import pandas as pd


data1 = [['A', '7478399993'], ['B', '4839948823'], ['C', '74819984839']]

df1 = pd.DataFrame(data1, columns=['Company', 'INN'])

INN = df1['INN'].to_list()


data2 = [['N57', '1000', '13 JAN', '15', '7478399993'], ['N58', '500', '22 JAN', '12', '4845948823'], \
         ['N60', '1000', '10 FEB', '18', '4839948823'], ['N61', '1000', '5 JAN', '10', '4449948823'], \
         ['N62', '900', '29 JAN', '18', '7478399993'], ['N63', '1000', '10 JUN', '14', '4839948823']]

df2 = pd.DataFrame(data2, columns=['Number', 'Value', 'Date', 'Percent', 'INN'])


for x in INN :

     df3 = df2.loc[(df2['INN'] == (x))]

     print(df3)

Ответы (2 шт):

Автор решения: strawdog

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

res = df2[df2["INN"].isin(df1["INN"])]

res:

  Number Value    Date Percent         INN
0    N57  1000  13 JAN      15  7478399993
2    N60  1000  10 FEB      18  4839948823
4    N62   900  29 JAN      18  7478399993
5    N63  1000  10 JUN      14  4839948823

→ Ссылка
Автор решения: CrazyElf

Или, как вариант, использовать merge:

res = df2.merge(df1, on='INN')

Результат:

    Number  Value   Date    Percent INN         Company
0   N57     1000    13 JAN  15      7478399993  A
1   N62      900    29 JAN  18      7478399993  A
2   N60     1000    10 FEB  18      4839948823  B
3   N63     1000    10 JUN  14      4839948823  B
→ Ссылка