【问题标题】:merge two csv file using python使用python合并两个csv文件
【发布时间】:2020-11-22 23:55:00
【问题描述】:

我有两个带有通用标题的 csv 我需要将两个 csv 文件合并到一个 csv 文件列中 我的第一个 csv 文件看起来像

 step   item    path_of_logfile value
adi landlord    /home/abcd.txt  1000
vc  abcd    /hom/efgh.txt   2000

另一个 csv 看起来像这样

step    item    path_of_logfile value
adi landlord    /home/txt        4500
VC  abcd    /home/efgh.txt      3000
DC  abcd    /home/efgh.txt      pass

所需的输出是

step item path_of_logfile value path_of_logfile value
 adi  landlord  /home/abcd.txt 4500 /home/abcd.txt1000
 VC abcd     /home/efgh.txt 3000/home/efgh.txt 2000
 DC   abcd     /home/efgh.txt pass

我使用 pandas 通过 python 完成

code
   import pandas as pd
  first = pd.read_csv('1st.csv')
  second = pd.read_csv('2nd.csv')
  merged = pd.concat([first, second], axis=1) 

请帮助我获得所需的输出 csvfile

【问题讨论】:

    标签: python-3.x dataframe csv


    【解决方案1】:

    你很接近。您需要 merge 数据帧而不是连接它们。在这种情况下,您希望合并相同的键值。

    您的问题有点复杂(不多),因为您的 .csv 文件不是标准格式,因为值之间有多个空格而不是逗号(csv 中的“c”)。

    这行得通。值得注意的是,另一个文件中的小写“vc”和大写“VC”不匹配。也许这是一个错字?

    import pandas as pd
    first = pd.read_csv('1st.csv', sep= '\s+')
    second = pd.read_csv('2nd.csv', sep= '\s+')
    
    merged = first.merge(second, how='outer', on='step')  
    
    print(merged)
    
    merged.to_csv('merged.csv', na_rep='pass', index=False)
    

    产量:

      step    item_x path_of_logfile_x  value_x    item_y path_of_logfile_y value_y
    0  adi  landlord    /home/abcd.txt   1000.0  landlord         /home/txt    4500
    1   vc      abcd     /hom/efgh.txt   2000.0       NaN               NaN     NaN
    2   VC       NaN               NaN      NaN      abcd    /home/efgh.txt    3000
    3   DC       NaN               NaN      NaN      abcd    /home/efgh.txt    pass
    

    CSV 文件:

    step,item_x,path_of_logfile_x,value_x,item_y,path_of_logfile_y,value_y
    adi,landlord,/home/abcd.txt,1000.0,landlord,/home/txt,4500
    vc,abcd,/hom/efgh.txt,2000.0,pass,pass,pass
    VC,pass,pass,pass,abcd,/home/efgh.txt,3000
    DC,pass,pass,pass,abcd,/home/efgh.txt,pass
    

    【讨论】:

    • 如果您的匹配条件既是“步骤”又是“项目”,您可以将其作为合并中on 字段的列表传入。
    • 在不使用 pandas 的情况下我们可以有另一种方法吗
    • 当然。你在原版中使用了 pandas,所以这似乎是你想要的路径。您需要使用您想要加入文件的方式更新您的帖子。你只是匹配“步骤”吗?另外,尝试一下基本的阅读和字典......
    • 你能提供我的代码,以便我可以用它作为我学习的开始
    【解决方案2】:

    代码:

    import pandas as pd
    first = pd.read_csv('1st.csv', sep='    ', engine='python')
    second = pd.read_csv('2nd.csv', sep='    ', engine='python')
    merged = pd.concat([second, first] ,axis=1, keys = 'step')
    print(merged)
    

    输出:

    s                                    t                                  
      step      item path_of_logfile value step      item path_of_logfile   value
    0  adi  landlord       /home/txt  4500  adi  landlord  /home/abcd.txt  1000.0
    1   VC      abcd  /home/efgh.txt  3000   vc      abcd   /home/fgh.txt  2000.0
    2   DC      abcd  /home/efgh.txt  pass  NaN       NaN             NaN     NaN
    

    您需要在 pd.concat() 内定义 keys 以便它可以定位列它必须在其上执行连接。另外,我在这里使用了 engine='python' 否则会引发警告。我也在考虑这里的数据有 4 个空格分隔符,这就是为什么我为 sep 方法分配了 4 个空格。

    【讨论】:

    • 我们可以不使用熊猫吗
    • @humblefool78 我没有看到任何其他方法来执行连接,因为仍然需要数据帧来操作连接,但是我不知道是否有任何其他方法,如果有那么它学习这种新方法会很棒
    猜你喜欢
    • 2013-04-22
    • 2020-08-22
    • 2020-03-18
    • 2012-08-12
    • 2019-02-22
    • 2019-03-27
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    相关资源
    最近更新 更多