好的,我知道标题可能会有些混乱,但是我将尝试详细解释一下:
我使用Python 3.5.2:
我得到了两个通过熊猫读取的.csv文件,并将其转换为两个单独的数据帧。第一个数据帧(来自XYZ.csv)如下所示:
ip community
10.0.0.1 OL123
.
.
.
123.12.5.31 IK753
第二个(export.csv)仅具有“ ip”列。
现在我要做的是:
我想比较这两个数据帧,结果得到第三个数据帧(或列表),其中包含第一个数据帧中的所有ip地址,而另一个不包含其他IP地址及其相关社区。到目前为止,只要第二个数据框也包含社区,我就设法比较了两者并获得了适当的结果。我手动将这些社区插入到第二个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”保持一致的东西。我做了很多尝试,但是似乎什么也无法工作。也许我只是对这里的逻辑有疑问,感谢所有帮助!
另外,请原谅代码混乱,我将所有内容放在一起,并在代码实际起作用后将其清理干净。
最佳答案
这是一些要使用的伪数据:
这是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
关于python - 两个数据框,一个具有比另一列更多的列->减去并合并,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40586590/