2016-11-14 56 views
1

好吧,我知道標題可能有點混亂,但我會盡量詳細地解釋這一點:兩個Dataframes,其中一個比另一個更列 - >減,並結合

我使用Python 3.5。 2:

我有兩個.csv文件,我通過熊貓讀取並轉換成兩個單獨的數據框。第一個數據幀(從XYZ.csv推出)看起來是這樣的:

ip    community 
10.0.0.1  OL123 
. 
. 
. 
123.12.5.31 IK753 

第二(export.csv)只是有 「IP」 欄中。

現在我想做的事:

我想這兩個dataframes比較,結果得到第三個數據幀(或列表),它包含所有的IP地址是在第一個數據幀而不是在其他與他們相關的社區。到目前爲止,只要第二個數據框還包含社區,我就設法比較了這兩者並得到了正確的結果。我手動插入這些communites到第二個export.csv,不幸的是我不能自動化這個,這就是爲什麼我需要這個工作,沒有包含社區的第二個數據框。

這是我的代碼:

def compare_csvs(): 
     timestamp = time.strftime("%Y-%m-%d") 

    # Reads XYZ.csv and creates list that contains all ip addresses in integer format. 
     A = pd.read_csv("XYZ.csv", index_col=False, header=0) 
     ips1 = A.ip.tolist() 
     comu1 = A.ro_community.tolist() 
     AIP = [] 
     for element1 in ips1: 
        AIP.append(int(ipaddress.IPv4Address(element1))) 
     IPACOM1 = zip(AIP,comu1)    

    # Reads export.csv and creates list that contains all ip addresses in integer format. 
     B = pd.read_csv("export" + timestamp + ".csv", index_col=False, header=0) 
     ips2 = B.ip.tolist() 
     comu2 = B.ro_community.tolist() 
     BIP = [] 
     for element2 in ips2: 
        BIP.append(int(ipaddress.IPv4Address(element2))) 
     IPACOM2 = zip(BIP,comu2) 

    # Creates a set that contains all ip addresses (in integer format) that exist inside the XYZ.csv but not the export.csv. 
     DeltaInt = OrderedSet(IPACOM1)-OrderedSet(IPACOM2) 
     List = list(DeltaInt) 
     UnzippedIP = [] 
     UnzippedCommunity = [] 
     UnzippedIP, UnzippedCommunity = zip(*List) 

    # Puts all the elements of the DeltaInt set inside a list and also changes the integers back to readable IPv4-addresses. 
     DeltaIP = [] 
     for element3 in UnzippedIP: 
       DeltaIP.append(str(ipaddress.IPv4Address(element3))) 

     IPandCommunity = zip(DeltaIP,UnzippedCommunity) 

現在我需要的東西,可以比較兩個列表,我創建並保持「社區」與它被分配到「IP」。我嘗試了很多,但似乎無法得到任何工作。也許我只是在這裏的邏輯有問題,所有幫助表示讚賞!

此外,請原諒代碼亂七八糟,我只是扔在一起,一旦代碼實際工作將清理它。

回答

0

這裏是玩一些虛擬數據:

這是DF:

ip    community 
10.0.0.1  OL123 
10.1.1.1  ACLSH 
10.9.8.7  OKUAJ1 
123.12.5.31  IK753 

df = pd.read_clipboard() 

這是export.csv:

s_export = pd.Series(s_export = pd.Series(name='ip', data=['10.1.1.1','123.12.5.31', '0.0.0.0']) 

s_export 

0  10.1.1.1 
1 123.12.5.31 
2  0.0.0.0 
Name: ip, dtype: object 

要選擇不在的那些出口,我們可以簡單地使用布爾索引使用isin()

# ~ means 'not', so here that's "find df.ip that is NOT in s_export" 
# Store result in a dataframe 
df_exclude = df[~df.ip.isin(s_export)] 


df_exclude 
     ip community 
0 10.0.0.1  OL123 
2 10.9.8.7 OKUAJ1 
+0

isin()的概念似乎很有幫助,但不幸的是,我沒有得到正確的結果。結果只包含整個數據幀「df」,並不排除export.csv中的數據幀。 – JaWi

+0

你試過運行我給你的具體例子嗎?我100%肯定它的工作原理 –

+1

啊,我發現了這個問題。只要將「B」數據框轉換爲參數「squeeze = True」的序列,它就會工作。作爲輸出,我現在得到了一個包含相關IP地址和其社區的數據框。這是朝着正確方向邁出的一大步,謝謝! – JaWi

相關問題