【问题标题】:Merging rows from .csv files with different lengths (python 3.x)合并不同长度的 .csv 文件中的行(python 3.x)
【发布时间】:2016-02-04 20:45:28
【问题描述】:

File1:

2015-01-01 07:00     1    1    1    1
2015-01-01 07:01     1    1    1
2015-01-01 07:02     1    1    1    1

File2:

2015-01-01 07:00     2    2 
2015-01-01 07:01     2    2
2015-01-01 07:02     2    2

考虑到每一行的时间戳,我想将 File2 中的文件合并到 File1 中。所以我写了一个dictionaryfor File1and File2 dict1dict2with k= Timestamp and v= values。 我的代码如下所示:

merged_files = {d1k: d1v+File2Dic.get(d1k[:],[]) for d1k,d1v in File1Dic.items()}

这让我得到一个输出: merged_files:

2015-01-01 07:00     1    1    1    1    2    2
2015-01-01 07:01     1    1    1    2    2
2015-01-01 07:02     1    1    1    1    2    2

我想要:

2015-01-01 07:00     1    1    1    1    2    2
2015-01-01 07:01     1    1    1         2    2
2015-01-01 07:02     1    1    1    1    2    2

关于如何调整合并代码以获得该结果的任何想法

【问题讨论】:

    标签: csv python-3.x merge


    【解决方案1】:

    您可以使用 pandas 函数 merge,然后用空字符串填充 NaN 值。

    您可以通过函数to_csv 将结果写入csv。

    解释一下,为什么在第 4 列中是 1.0 而不是 1:
    因为NaN 值被强制转换为 float64。 link

    import pandas as pd
    import numpy as np
    import io
    
    temp=u"""2015-01-01 07:00;1;1;1;1
    2015-01-01 07:01;1;1;1;
    2015-01-01 07:02;1;1;1;1"""
    
    df = pd.read_csv(io.StringIO(temp), sep=";", header=None)
    print df
    
    temp1=u"""2015-01-01 07:00;2;2 
    2015-01-01 07:01;2;2
    2015-01-01 07:02;2;2"""
    
    df1 = pd.read_csv(io.StringIO(temp1), sep=";", header=None)
    print df1
    
    #merge by first column - by dates
    result = pd.merge(df, df1, on=0)
    #fill NaN values by empty string
    result = result.fillna('')
    print result
    #                  0  1_x  2_x  3  4  1_y  2_y
    #0  2015-01-01 07:00    1    1  1  1    2    2
    #1  2015-01-01 07:01    1    1  1       2    2
    #2  2015-01-01 07:02    1    1  1  1    2    2
    
    print result.to_csv(header=False, index=False)
    #2015-01-01 07:00,1,1,1,1.0,2,2
    #2015-01-01 07:01,1,1,1,,2,2
    #2015-01-01 07:02,1,1,1,1.0,2,2
    

    【讨论】:

    • 感谢您的帮助...temp=utemp1=u是什么?
    • 您可以使用io.StringIO(temp) 代替file1.csvio.StringIO(temp1) 类似
    • o 我没明白他们在哪里打印
    • 如果你在 csv 制表符中有分隔符,你可以使用df = pd.read_csv(io.StringIO(temp), sep="\t", header=None)
    • 对我有帮助。错过了接受按钮,最后几天不在,抱歉耽搁了
    猜你喜欢
    • 2011-02-02
    • 1970-01-01
    • 2019-04-23
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-28
    • 2023-04-05
    相关资源
    最近更新 更多