代码之家  ›  专栏  ›  技术社区  ›  Karn Kumar

用pandas处理csv文件,并将已处理文件的输出与现有文件进行比较。

  •  2
  • Karn Kumar  · 技术社区  · 6 年前

    我正在尝试处理一个csv文件并提取主机名,然后将提取内容保存到一个名为 host_file1 然后将此文件与现有的文本文件ie进行比较 host_file2 ,所以csv处理工作正常。

    现在,正如我所说,我想在两个文件之间做一些主机名比较,我想要的是匹配主机名在 HooSt2文件2 具有 HooSt1文件1 ,如果主机名在 HooSt2文件2 但不在 HooSt1文件1 打印主机名,不要打印两个文件中的主机名。

    我已经尝试过类似下面的设置,但它只是给出了区别,而不是我想要的。

    #!/python/v3.6.1/bin/python3
    from __future__ import print_function
    from signal import signal, SIGPIPE, SIG_DFL
    signal(SIGPIPE,SIG_DFL)
    import pandas as pd
    ##### Python pandas, widen output display to see more columns. ####
    pd.set_option('display.height', None)
    pd.set_option('display.max_rows', None)
    pd.set_option('display.max_columns', None)
    pd.set_option('display.width', None)
    pd.set_option('expand_frame_repr', True)
    ##################### END OF THE Display Settings ###################
    
    df_csv = pd.read_csv(input("Please input the CSV File Name: "), usecols=['Platform ID', 'Target system address']).dropna()
    hostData = df_csv[df_csv['Platform ID'].str.startswith("CDS-Unix")]['Target system address']
    hostData.to_csv('host_file1', header=None, index=None, sep=' ', mode='a')
    
    with open('host_file1', 'r') as f:
        dataset1 = set(f)
    with open('host_file2', 'r') as f:
        dataset2 = set(f)
    for i, item in enumerate(sorted(dataset1 ^ dataset2)):
        print(str(item))
    # shorter
    """
    with open('host_file1') as f1, open('host_file2') as f2:
        dataset1 = set(f1)
        dataset2 = set(f2)
    """
    

    两个不同的主机名文件:

    HooSt1文件1

    vmhost01
    
    vmhost02
    
    vmhost03
    
    vmhost04
    
    vmhost05
    
    vmhost06
    
    vmhost07
    
    vmhost08
    
    vmhost09
    
    vmhost10
    

    HooSt2文件2

    vmhost01
    
    vmhost02
    
    vmhost03
    
    vmhost04
    
    vmhost05
    
    vmserver01
    
    vmhost07
    
    vmhost08
    
    vmserver02
    
    vmhost10
    

    预期结果:

    vmserver01
    vmserver02
    
    4 回复  |  直到 6 年前
        1
  •  1
  •   jezrael    6 年前

    我想你需要减法集:

    for i, item in enumerate(sorted(dataset2 - dataset1)):
    #alternative
    #for i, item in enumerate(sorted(dataset2.difference(dataset1))):
        print(str(item))
        vmhost01
        vmhost02
        vmserver01
        vmserver02
    

    最后一个理解列表的解决方案是:

    s = set(dataset1)
    out = [x for x in dataset2 if x not in s]
    print (out)
    ['vmserver02', 'vmhost02', 'vmhost01', 'vmserver01']
    
        2
  •  1
  •   Lau Real    6 年前

    我觉得你的代码很复杂,下面的代码怎么样?

    import csv
    with open("test.csv", "r") as t1:
        data1 = t1.read().split()
    with open("test2.csv", "r") as t2:
        data2 = t2.read().split()
    //u can exchange data2 and data1 to get what in data1 and not in data2
    print([item for item in data2 if item not in data1])
    
        3
  •  1
  •   LOrD_ARaGOrN    6 年前

    您可以对文件进行diff以查看结果

    diff host_file1 host_file2
    

    上面是一个unix命令。因此,您需要使用操作系统或子进程来运行其中的命令。

    如果上面不是文件,而是数据帧,请尝试下面的操作

    diff = (host_file1 != host_file2).any(1)
    print diff
    

    还有一个解决方案。这里这两个数据帧的列名应该相同。如果它们不同,则重命名其中一个以使其与另一个相同。

    import pandas as pd
    host_file1 = pd.read_excel("data.xlsx", sheet_name = 2)
    print host_file1
    host_file2 = pd.read_excel("data.xlsx", sheet_name = 3)
    print host_file2
    pd.concat([host_file1,host_file2]).drop_duplicates(keep=False)
    
        4
  •  0
  •   Mattias    6 年前

    您可以创建两个数据帧,每个数据集一个,然后外部合并数据帧并选择未标记为“两者”的数据帧。

    df = pd.merge(df1, df2, how='outer', indicator=True)
    df = df.loc[df['_merge'] == 'right_only']
    

    之后,您就可以打印新的数据框了。