我有一个函数find_country_from_connection_ip
,基本上需要一个pandas系列,并在处理后返回一个国家/地区。
def find_country_from_connection_ip(ip):
final_output = None
result = subprocess.Popen("mmdblookup --file GeoIP2-Country.mmdb --ip {} country names en".format(ip).split(" "), stdout=subprocess.PIPE).stdout.read()
if result:
final_output = result
else:
final_output = subprocess.Popen("mmdblookup --file GeoIP2-Country.mmdb --ip {} registered_country names en".format(ip.iloc[0]).split(" "), stdout=subprocess.PIPE).stdout.read()
return re.search(r'\"([\w\s]+)\"', final_output).group(1)
我要做的是在我的DataFrame上使用上述函数的返回值形成一个新列。我的尝试是:
dataframe_without_connection_ips['Country'] =
dataframe_without_connection_ips.apply(lambda x:find_country_from_connection_ip(x['Connection IP']), axis=1)
但是,我得到的错误是:
AttributeError :(“'str'对象没有属性'iloc'”,在索引303449处发生')
所以,我的理解是说可能是index
303449生成的错误。所以,我试图用该特定索引调用该函数。
test_ip = dataframe_without_connection_ips[dataframe_without_connection_ips.index== 303449]['Connection IP']
find_country_from_connection_ip(test_ip)
而且,令人惊讶的是我得到了预期的输出'United Kingdom'
而没有错误。
这里发生了什么?
答案 0 :(得分:0)
根据函数在行上的应用方式,函数的输入是字符串。但是,在函数中有这个操作
ip.iloc[0]
似乎假设输入是Series或DataFrame。这解释了错误消息。
在随后的测试中,函数的输入实际上变成了一个Series,这就是iloc
索引不会失败的原因。