#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 для получения данных).