Как применить фильтр Pandas к фрейму данных на основе записей в столбце из другого фрейма данных (без объединения) - PullRequest
0 голосов
/ 27 апреля 2020

Например, у меня есть один фрейм данных (df_1) с одним столбцом, который содержит некоторые текстовые данные. Второй кадр данных (df_2) содержит несколько чисел. Как проверить, содержит ли текст числа из второго фрейма данных?

df_1

                       Note
0  The code to this is 1003
1  The code to this is 1004

df_2

   Code_Number
0         1006
1         1003

Поэтому я хочу проверить, содержит ли записи в [Note] из df_1 записи из [Code_Number] из df_2

Я попытался использовать следующий код: df_1[df_1['Note'].str.contains(df_2['Code_Number'])] и знаю, что не могу использовать присоединиться, поскольку у меня нет ключа для присоединения.

Окончательный результат, который я ищу после применения фильтрации:

   Note              
0  The code to this is 1003    

Ответы [ 3 ]

1 голос
/ 27 апреля 2020

Попробуйте и посмотрите, охватывает ли он ваш сценарий использования: получите кросс-декартову обе колонки, используя продукт itertools и примените фильтр на основе условия:

from itertools import product
m = [ left for left, right
      in product(df.Note,df1.Code_Number) 
      if str(right) in left]

pd.DataFrame(m,columns=['Note'])

               Note
0   The code to this is 1003
1 голос
/ 27 апреля 2020

Сделайте это:

df_1.loc[df_1['Note'].apply(lambda x: any(str(number) in x for number in df_2['Code_Number']))]
0 голосов
/ 27 апреля 2020
Firstly, you have to create 1 column in your df1 where the notes are with a list of numbers that are present in the Notes and then Compare the List column of numbers with the List column of the df2 where the numbers are present(both should be in list format)



#Extract Numbers from Notes
a_string = "0abcadda1 11 def 23 10007"

numbers = [int(word) for word in a_string.split() if word.isdigit()]

print(numbers)


list_test = "103,23"

#Finding common element from both lists the list
L1 = [2,3,4]
L2 = [1,2]
[i for i in L1 if i in L2]


S1 = set(L1)
S2 = set(L2)
print(S1.intersection(S2))

#If you want to find out the common element

def common_data(list1, list2):
    result = False

    # traverse in the 1st list 
    for x in list1:

        # traverse in the 2nd list 
        for y in list2:

            # if one common 
            if x == y:
                result = True
                return result

    return result


# driver code 

a = [1, 2, 3, 4, 5]
b = [5, 6, 7, 8, 9]
print(common_data(a, b))

a = [1, 2, 3, 4, 5]
b = [6, 7, 8, 9]
print(common_data(a, b)) 
...