为什么在DataFrame.apply()中出现AttributeError而在单个函数调用中没有出现?

时间:2016-10-23 09:55:39

标签: python pandas

我有一个函数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'而没有错误。

这里发生了什么?

1 个答案:

答案 0 :(得分:0)

根据函数在行上的应用方式,函数的输入是字符串。但是,在函数中有这个操作

ip.iloc[0]

似乎假设输入是Series或DataFrame。这解释了错误消息。

在随后的测试中,函数的输入实际上变成了一个Series,这就是iloc索引不会失败的原因。