好吧,我知道標題可能有點混亂,但我會盡量詳細地解釋這一點:兩個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」。我嘗試了很多,但似乎無法得到任何工作。也許我只是在這裏的邏輯有問題,所有幫助表示讚賞!
此外,請原諒代碼亂七八糟,我只是扔在一起,一旦代碼實際工作將清理它。
isin()的概念似乎很有幫助,但不幸的是,我沒有得到正確的結果。結果只包含整個數據幀「df」,並不排除export.csv中的數據幀。 – JaWi
你試過運行我給你的具體例子嗎?我100%肯定它的工作原理 –
啊,我發現了這個問題。只要將「B」數據框轉換爲參數「squeeze = True」的序列,它就會工作。作爲輸出,我現在得到了一個包含相關IP地址和其社區的數據框。這是朝着正確方向邁出的一大步,謝謝! – JaWi