【问题标题】:How to merge different rows in a csv files by python如何通过python合并csv文件中的不同行
【发布时间】:2019-04-23 14:55:26
【问题描述】:

我已经从网站上删除了一些内容并将数据保存到一些不同的 csv 文件中。

例如,

csv1:-

row number    time              price
1              2018/01/01        12
2              2018/01/02        15

csv2:-

row number    time              address
1              2018/01/01        MI
2              2018/01/02        AR

现在,如何将两个 csv 文件合并为一个 csv 文件,下面是新 csv 的格式。

row number    time              price         address
1              2018/01/01        12             MI
2              2018/01/02        15             AR

有人可以帮我吗?

这个问题困扰了我好几天。

非常感谢!

enter image description here

enter image description here

【问题讨论】:

    标签: python-3.x


    【解决方案1】:

    您可以使用 Pandas df.append()。您可以参考this answer

    如果这些 CSV 具有不同的列,则将它们中的每一个单独读取为 Pandas DataFrame,然后创建一个新的 DataFrame 引用先前创建的各个 DataFrame 的列。

    【讨论】:

    • 其实我也是这样做的,但是还是有一些问题。新的 csv 文件包含所有数据,但同一时间的数据根据​​它们的 vulunms 位于不同的行中。例如,新的 csv 文件应该有 2 行,但是在 append() 之后,它有 4 行。
    【解决方案2】:

    对于你的情况,你也可以使用 pandas 的pd.merge 命令:

    In [488]: df1 = pd.read_csv('/home/mayankp/Documents/Personal/stackoverflow/csv1.csv')
    
    In [498]: df1
    Out[498]: 
       row_number        time  price
    0           1  2018/01/01     12
    1           2  2018/01/02     15
    
    In [490]: df2 = pd.read_csv('/home/mayankp/Documents/Personal/stackoverflow/csv2.csv')
    
    In [499]: df2
    Out[499]: 
       row_number        time address
    0           1  2018/01/01      MI
    1           2  2018/01/02      AR
    
    In [500]: pd.merge(df1,df2, on=['row_number','time'])
    Out[500]: 
       row_number        time  price address
    0           1  2018/01/01     12      MI
    1           2  2018/01/02     15      AR
    

    【讨论】:

    • 非常有帮助!非常感谢!
    • 对不起,还有一个新问题。在我的数据集中,并非所有列的行数都相同,例如,价格从 2018/01/01 开始,但地址从 2017/11/01 开始。在这种情况下,新的 csv 文件只会从 2018/01/01 开始。它会将地址数据从 2017/11/01 删除到 2017/12/31。那么,我该如何处理这个问题。
    • @YaoQiang 如果回答有帮助,请点赞采纳。
    【解决方案3】:

    尝试以下方法:

    import pandas as pd
    
    csv1 = pd.read_csv("file1.csv")
    csv2 = pd.read_csv("file2.csv")
    
    csv_out = csv1.merge(csv2, on=['row number','time'])
    csv_out.to_csv("file_out.csv", index=False)
    

    希望对你有帮助。

    【讨论】:

    • 非常有帮助!非常感谢!
    • 对不起,还有一个新问题。在我的数据集中,并非所有列的行数都相同,例如,价格从 2018/01/01 开始,但地址从 2017/11/01 开始。在这种情况下,新的 csv 文件只会从 2018/01/01 开始。它会将地址数据从 2017/11/01 删除到 2017/12/31。那么,我该如何处理这个问题。
    • 我明白了。您能否更新您的问题以包含这些案例?
    • 太棒了。您现在只需将您认为符合您需求的答案之一标记为已接受。谢谢。
    【解决方案4】:

    我知道您有 csv 文件,但在这里我只是展示并尝试通过手动创建 DataFrames 来帮助您,正如您在问题中提到的那样。

    下面是您要查找的代码。

    >>> import pandas as pd
    >>>
    >>> dri = pd.date_range("2018/01/01", periods=2, freq="d")
    >>>
    >>> df = pd.DataFrame({"time": dri, "price": [12, 15]}, index = [1, 2])
    >>> df
            time  price
    1 2018-01-01     12
    2 2018-01-02     15
    >>>
    >>> df2 = pd.DataFrame({"time": dri, "address": ["MI", "AR"]}, index=[1, 2])
    >>> df2
            time address
    1 2018-01-01      MI
    2 2018-01-02      AR
    >>>
    >>> # https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.merge.html
    ...
    >>>
    >>> df.merge(df2, on = "time", how = "inner", left_index = True)
            time  price address
    1 2018-01-01     12      MI
    2 2018-01-02     15      AR
    >>>
    

    默认情况下,pandas 不包含 DataFrame 左侧的索引标签。如果您确实希望像您提到的那样为 DataFrame 的索引添加标签(在您的情况下,即row number),请查看以下 Python 交互式终端上执行的语句。

    >>> df.index.name = "row number"
    >>> df
                     time  price
    row number
    1          2018-01-01     12
    2          2018-01-02     15
    >>>
    >>> df2.index.name = "row number"
    >>>
    >>> df2
                     time address
    row number
    1          2018-01-01      MI
    2          2018-01-02      AR
    >>>
    >>> df.merge(df2, on = "time", how = "inner", left_index = True)
                     time  price address
    row number
    1          2018-01-01     12      MI
    2          2018-01-02     15      AR
    >>>
    

    【讨论】:

    • 非常有帮助!非常感谢!
    • 对不起,还有一个新问题。在我的数据集中,并非所有列的行数都相同,例如,价格从 2018/01/01 开始,但地址从 2017/11/01 开始。在这种情况下,新的 csv 文件只会从 2018/01/01 开始。它会将地址数据从 2017/11/01 删除到 2017/12/31。那么,我该如何处理这个问题。
    • 好的@Yao,只需提供您数据的任何输出格式,以便我可以更好地了解您的意图。您可以在 github 中创建 gist 并发送输入和输出格式的链接。这将帮助我帮助你,或者如果你希望你也可以在这个问题中添加一些描述。谢谢你回复我。
    猜你喜欢
    • 2020-06-22
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 2019-10-31
    • 2022-07-28
    • 2018-08-07
    • 1970-01-01
    • 2020-07-22
    相关资源
    最近更新 更多