2016-10-04 108 views
0

我有一個DataFrame與源IP地址,我想檢查它們是否屬於記錄的CIDR範圍。對DataFrame列應用函數返回NoneType

netflow_df2["sip"].head(10) 

timestamp 
2016-10-04 16:24:58 40.101.X.X 
2016-10-04 16:24:58 40.101.X.X 
2016-10-04 16:24:58  40.101.X.X 
2016-10-04 16:24:58  67.X.X.X 
2016-10-04 16:24:58  10.1.1.X 
2016-10-04 16:24:58  10.1.Y.Y 



import ipaddress 
import numpy 
from collections import defaultdict 
from pandas.util.testing import test_parallel 

我把所有的記錄CIDRs我知道在一個字典:

# dict to key (vlan, designation) 
nets = defaultdict(str) 
nets["10.1.0.0/24"] = "13, web" 
net["10.2.0.0/24"] = "14, department X" 
net["10.3.55.0/24"] = "601, wifi" 
... 
net["10.1.243.0/24"] = "1337, IT" 

我定義我的功能:

def netmap(ip, network_lookup_dict): 
    for key, value in network_lookup_dict.iteritems() : 
     if ipaddress.ip_address(unicode(ip)) in ipaddress.ip_network(unicode(key)): 
      return value 
      # print "VLAN: " + infos[0].strip() + ", Network designation: " + infos[1].strip() 
     else: 
      return numpy.NAN 

現在我映射它:

@test_parallel(num_threads=4) 
def apply_netmap(netflow_df2, location="ABC"): 
    % time netflow_df2["sip_infos"] = netflow_df2["sip"].map(lambda ip: netmap(ip, nets)) 
    return netflow_df2 


CPU times: user 3min 14s, sys: 21.2 s, total: 3min 36s 
Wall time: 3min 5s 


netflow_df3 = apply_netmap(netflow_df2) 

我的錯誤是:

netflow_df3.head(10) 

AttributeError: 'NoneType' object has no attribute 'head'

我的印象是這個函數會的netmap()返回值映射到數據框欄下。這也是我返回NAN的原因。這似乎並非如此。它也超級慢。

+1

你的功能需要有'return netflow_df2' –

+0

對不起,複製粘貼錯誤。 – wishi

+1

這是什麼:if ipaddress.ip_address(unicode(ip))in ipaddress.ip_network(unicode(key)) –

回答

0

問題是我在netmap函數中使用defaultdict錯誤。這產生了更正結果:

def netmap(ip, network_lookup_dict): 
    for key, value in network_lookup_dict.iteritems(): 
     try: 
      if ipaddress.ip_address(unicode(ip)) in ipaddress.ip_network(unicode(key)): 
       return network_lookup_dict.get(key) 
     except KeyError: 
      print "duh" 
      return numpy.NaN 

return聲明已損壞。這讓我感到困惑,爲什麼這會破壞DataFrame對象,但我認爲一切都有錯誤。