Импорт списка из текстового файла для сравнения с фреймом данных с помощью isin () - PullRequest
0 голосов
/ 01 июня 2018

У меня есть датафрейм адресов, включая почтовые индексы.Я пытаюсь проверить, действительны ли эти почтовые индексы, импортировав список из текстового файла действительных почтовых индексов.Я не могу получить правильный тип данных ни из списка, ни из данных.

Мой список выглядит так в текстовом файле

00501, 00544, 00601, 00602, 00603, 00604, 00605, 00606, 00610, 00611, 00612, 00613, 00614, 00616, 00617, 00622, 00623, 00624, 00627, 00631, 00636, 00637, 00638, 00641, 00646, 00647, 00650, 00652, 00653, 00656, 00659, 00660, 00662, 00664, 00667, 00669, 00670, 00674, 00676, 00677, 00678, 00680, 00681, 00682, 00683, 00685, 00687, 00688, 00690, 00692, 00693, 00694, 00698, 00703, 00704, 00705, 00707, 00714, 00715, 00716, 00717, 00718, 00719, 00720, 00721, 00723, 00725, 00726..... 

И я импортирую список примерно так ...

text_file = open("/C:/valid_zipcodes.txt", "r")
zip_codes = text_file.readlines()

Я хочу вернутьbool с в функции.Это работает, если я создаю очень простой список в коде

zip_codes2 = [12401,12603]
df['valid_zip'] = df['Zip Code'].isin(zip_codes)
>>valid_zip True

print(df.dtypes)

>>Zip Code int64

Я попытался тип данных для объекта со следующим, он изменился на объект, но не смог найти его аналог в списке изтекстовый файл.Даже когда я изменил текстовый файл на «12345», «12346».

df['Zip Code'] =  df['Zip Code'].astype(str)

У кого-нибудь есть идеи?

1 Ответ

0 голосов
/ 01 июня 2018

Вам нужно разделить на ",".Также обратите внимание, что readlines возвращает list, один элемент для каждой строки.Похоже, ваш входной файл состоит только из одной строки, поэтому вам нужно будет извлечь первый элемент вашего списка.

Наконец, вам нужно убедиться, что вы сравниваете строки со строками или целые числа с целыми числами.В приведенном ниже примере я предполагаю, что ведущие 0 важны, и сравниваю строки по всему.

from io import StringIO

text_file = StringIO('00501, 00544, 00601, 00602, 00603, 00604')

## create set of zip codes
zip_codes = set(text_file.readlines()[0].split(', '))

## input series of strings
s = pd.Series(['00501', '00544', '00601', '00605'])
s_res = s.isin(zip_codes).tolist()

# [True, True, True, False]

## input series of integers
t = pd.Series([501, 544, 601, 605])
t_res = t.astype(str).str.zfill(5).isin(zip_codes).tolist()

# [True, True, True, False]
...