两个数据框,一个比另一个有更多的列 -> 减法和组合

Two Dataframes, one with more columns than the other -> Subtract and Combine

好的,我知道标题可能有点令人困惑,但我会尝试详细解释一下:

我用的是Python3.5.2:

我通过 pandas 读取了两个 .csv 文件并将其转换为两个单独的数据帧。第一个数据框(来自 XYZ.csv)如下所示:

ip              community
10.0.0.1        OL123
.
.
.
123.12.5.31    IK753

第二个 (export.csv) 只有 "ip" 列。

现在我想做什么:

我想比较这两个数据框,结果得到第三个数据框(或列表),其中包含第一个数据框中的所有 ip-addresses,但不在另一个数据框及其相关社区中。到目前为止,我设法比较了两者并得到了正确的结果,只要第二个数据框也包含社区。我手动将这些社区插入第二个 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)

现在我需要的是可以比较我创建的两个列表并保留 "community" 和分配给它的 "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

对于 select 那些没有导出的,我们可以简单地使用布尔索引使用 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