使用isin()从文本文件导入列表以与数据帧进行比较

sca*_*ear 2 python string series pandas

我有一个地址数据框,包括邮政编码.我试图通过从有效邮政编码的文本文件中导入列表来查看这些邮政编码是否有效.我似乎无法从列表或数据框中获取正确的数据类型.

我的列表在文本文件中看起来像这样

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..... 
Run Code Online (Sandbox Code Playgroud)

而我正在导入列表......

text_file = open("/C:/valid_zipcodes.txt", "r")
zip_codes = text_file.readlines()
Run Code Online (Sandbox Code Playgroud)

我希望返回一个功能正常的bool.如果我在代码中创建一个非常简单的列表,这是有效的

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

print(df.dtypes)

>>Zip Code int64
Run Code Online (Sandbox Code Playgroud)

我已尝试使用以下对象的数据类型,它更改为对象,但无法在文本文件的列表中找到它的对应项.即使我将文本文件调整为'12345','12346'.

df['Zip Code'] =  df['Zip Code'].astype(str)
Run Code Online (Sandbox Code Playgroud)

有人有任何想法吗?

jpp*_*jpp 5

你需要用","分开.另请注意,每行readlines返回list一个元素.您的输入文件似乎只包含一行,因此您需要提取列表的第一个元素.

最后,您需要确保将字符串与字符串或整数与整数进行比较.在下面的例子中,我假设前导0s很重要并且在整个过程中比较字符串.

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]
Run Code Online (Sandbox Code Playgroud)