Найти, находится ли значение в столбцах в другом столбце

#python-3.x #pandas

#python-3.x #pandas

Вопрос:

У меня есть данные адреса жилья и почтового индекса, которые я хочу посмотреть, существует ли оно в другом столбце внутри другой таблицы.

У меня есть две таблицы Excel, которые я загрузил в Python, таблица A и таблица B. Я хочу взять каждое значение из столбца 1 (house_address) и столбца 2 (zip) из таблицы A и использовать цикл for, чтобы узнать, находится ли значение в таблице B, столбец 1 (full_address).

Таблица A:

house_address zip
124 HOUSE LANE 12345
123 home ln 54321

Таблица B:

house_address zip property_size full_address
124 HOUSE LANE 12345 1000 124 HOUSE LANE 12345
123 home ln 54321 2000 123 home ln 54321
987 strawberry rd 11111 3000 987 strawberry rd 11111

Мой код:

 # upload tables
table_a = pd.read_excel('table_a.xlsx')
table_b = pd.read_excel('table_b.xlsx')

# create a list from table b and table b of the full_address column for matching purposes
full_address_table_b = list(table_b['full_address'])


# for loop checks if the address is already in my table_B. If it is return the information to # the end user. If it is not then move on to the else statement which will do something else
for i in range(len(table_a)):

    
    # create a concat list of table a full address
    full_address_table_a = str(table_a['house_address'])   " "   str(table_b['zip'])

    # check if the address is already in our dataset
    if table_b.loc[table_b['full_address'].str.contains(full_address_table_a, case=False)]:

        # if it is, then just print the info from table b
        print(housing_df[housing_df['full_address'] == full_address_test])

    # else run another piece of code
    else:
        print("run this part of the code")
 

Когда я запускаю приведенный выше код, я получаю следующую ошибку:

Ошибка значения: значение истинности фрейма данных неоднозначно. Используйте .empty , .bool(),.item(), .any() или.all()

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

Ответ №1:

Вы можете просто объединить их, чтобы увидеть, какие значения являются общими, если это степень вашей проблемы:

 table_a.merge(table_b, on = ['house_address', 'zip'])
 

результаты:

 house_address   zip property_size   full_address
0   124 HOUSE LANE  12345   1000    124 HOUSE LANE 12345
1   123 home ln 54321   2000    123 home ln 54321
 

Если вы хотите конкретно определить, какие из них находятся только в table_a or table_b или обоих, передайте индикатор, а затем просто отфильтруйте его на основе этого, если это необходимо:

 table_a.merge(table_b, on = ['house_address', 'zip'], how = 'outer', indicator = True)
 

результаты:

 house_address   zip property_size   full_address    _merge
0   124 HOUSE LANE  12345   1000    124 HOUSE LANE 12345    both
1   123 home ln 54321   2000    123 home ln 54321   both
2   987 strawberry rd   11111   3000    987 strawberry rd 11111 right_only
 

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

1. Я думаю, что это одно из решений, но причина, по которой я использую цикл for, заключается в том, что я создаю что-то, что заставит пользователей вводить таблицу адресов Excel и ожидать увидеть вывод информации для всех домов. Цикл for позволит увидеть, есть ли адрес уже в основном наборе данных (если это так, он просто возьмет данные оттуда. если нет, вызовет API для получения данных).

Ответ №2:

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

 df1['full_address'] = df1['house_address'].astype(str)   " " df1['zip'].astype(str)
first_list = df1['house_address'].unique().tolist()
second_list = df2['house_address'].unique().tolist()

common_houses = [house for house in first_list if house in second_list] 
 

Затем, чтобы увидеть полные данные, совпадающие с полным адресом между 2, вы можете сделать:

 common_houses_df = df2[df2['full_address'].isin(common_houses)]
 

это даст вам полный набор данных с общими адресами из 2 файлов.

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

1. Я думаю, что это одно из решений, но причина, по которой я использую цикл for, заключается в том, что я создаю что-то, что заставит пользователей вводить таблицу адресов Excel и ожидать увидеть вывод информации для всех домов. Цикл for позволит увидеть, есть ли адрес уже в основном наборе данных (если это так, он просто возьмет данные оттуда. если нет, вызовет API для получения данных).