2017-03-23 61 views
0

我剛剛開始使用熊貓。我正在嘗試通過使用sockets.gethostbtname()解析主機名來填充IP地址列。使用Pandas和socket.gethostbyname填充數據幀的缺失IP地址

下面也稱爲數據

 domain  ip_address 
0 google.com   NaN 
1 yahoo.com   NaN 

樣本數據幀我有以下代碼:

data.ip_address = data['ip_address'].fillna(socket.gethostbyname(data.iloc[data.index]['domain'])) 

,但我得到的錯誤如下:

TypeError: gethostbyname() argument 1 must be str, bytes or bytearray, not Series 

回答

1

,你得到了錯誤是因爲socket.gethostbyname函數需要一個字符串或一個字節字符串,但輸入是一個Series。 每當我們對Pandas Dataframe執行非迭代操作時,它們都會在一個Series內部進行迭代。 因此,在這裏,您正在提取一個系列並將該系列作爲參數傳遞給socket.gethostbyname

所以,在這裏我們可以使用 「地圖」 來解決這個問題:現在

import socket 
import pandas as pd 
# Creating a dataframe with your input 
data_in = [{'domain': 'google.com', 'ip_address': None}, 
{'domain': 'yahoo.com', 'ip_address': None}] 
df = pd.DataFrame(data_in) 
df['ip_address'] = df['domain'].map(lambda host:socket.gethostbyname(host)) 

,這DF2將是如下。

 domain  ip_address 
0 google.com 172.217.26.174 
1 yahoo.com 98.139.180.149 

只有當所有主機名都有效時,主機名到ip的上述解析纔有效。假設,如果你有任何不可解析的主機名稱(比如test1989),這將失敗並且數據框不會被改變。