У меня есть данные об адресе жилья и почтовом индексе, которые я хочу увидеть, существуют ли они в другом столбце внутри другой таблицы.
У меня есть два листа Excel, которые я загрузил в Python, таблица A и таблица B. Я хочу взять каждое значение из столбца 1 (house_address) и столбца 2 (zip) из таблицы A и использовать цикл for, чтобы увидеть, находится ли значение в Таблица B, столбец 1 (полный_адрес).
Таблица А:
Таблица Б:
Мой код:
# 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")
Когда я запускаю приведенный выше код, я получаю следующую ошибку:
ValueError: истинное значение DataFrame неоднозначно. Используйте a.empty, a.bool(), a.item(), a.any() или a.all()
Мне было интересно, знает ли кто-нибудь, что я делаю неправильно здесь. Существует также, вероятно, более эффективный способ создания вышеуказанного кода, поэтому предложения по более эффективному коду приветствуются.
Вы можете просто объединить их, чтобы увидеть, какие значения являются общими, если это масштаб вашей проблемы:
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
или 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
Если вы не хотите использовать цикл 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]
Затем, чтобы увидеть полные данные о том, что полный адрес совпадает между двумя, вы можете сделать:
common_houses_df = df2[df2['full_address'].isin(common_houses)]
который даст вам полный набор данных с общими адресами из двух файлов.
Я думаю, что это одно из решений, но причина, по которой я использую цикл for, заключается в том, что я создаю что-то, что заставит пользователей вводить таблицы адресов в формате Excel и будет ожидать вывод информации для всех домов. Цикл for позволит увидеть, находится ли адрес уже в основном наборе данных (если это так, он просто возьмет данные оттуда. Если нет, вызовет API для получения данных).
Я думаю, что это одно из решений, но причина, по которой я использую цикл for, заключается в том, что я создаю что-то, что заставит пользователей вводить таблицы адресов в формате Excel и будет ожидать вывод информации для всех домов. Цикл for позволит увидеть, находится ли адрес уже в основном наборе данных (если это так, он просто возьмет данные оттуда. Если нет, вызовет API для получения данных).