【问题标题】:Pandas merge 5 csv files with only 1 different column namePandas 合并 5 个 csv 文件,只有 1 个不同的列名
【发布时间】:2017-01-11 23:00:15
【问题描述】:

我有 5 个 csv 文件,我正在尝试使用 Python Pandas 进行合并,而且由于内存问题,我正在运行 64 位 Python。

所有 5 个 csv 文件都有相同的列名: ['A', 'B', 'C', ... 'Start_time', 'end_time', 'Unique_column']

这里 Unique_column 是每个 CSV 文件的不同列名。所以我需要将所有 5 个文件相互合并,所以最后我会得到 DataFrame as

['A', 'B', 'C', ... 'Start_time', 'end_time', 'Unique_column1', 'Unique_colum2', ... 'Unique_colum5']

pandas.merge还是pandas.concat方法?

更新

>>> import os
>>> import glob
>>> import numpy as np
>>> import pandas as pd
>>> dir_name = r'C:\Users\data'
>>> dfs = []
>>> files = glob.glob(os.path.join(dir_name, '*.csv'))
>>> for f in files:
...   df = pd.read_csv(f)
...   dfs.append(df)
...
>>> common_cols = ['Target', 'POS', 'Start_Week', 'End_Week', 'Measure_Metric']
>>> res = pd.concat([df.set_index(common_cols) for df in dfs], axis=1).reset_index()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:\Python27x64\lib\site-packages\pandas\tools\merge.py", line 846, in concat
    return op.get_result()
  File "c:\Python27x64\lib\site-packages\pandas\tools\merge.py", line 1031, in get_result
    indexers[ax] = obj_labels.reindex(new_labels)[1]
  File "c:\Python27x64\lib\site-packages\pandas\indexes\multi.py", line 1422, in reindex
    raise Exception("cannot handle a non-unique multi-index!")
Exception: cannot handle a non-unique multi-index!
>>>

【问题讨论】:

    标签: python csv pandas merge


    【解决方案1】:

    IIUC,在将每个索引设置为所有公共列后使用pd.concat

    假设您已将所有文件导入列表dfs

    dfs = [df1, df2, df3, df4, df5]
    

    然后连接like

    common_cols = ['A', 'B', 'C', 'Start_time', 'end_time']
    pd.concat([df.set_index(common_cols) for df in dfs], axis=1).reset_index()
    

    【讨论】:

    • 收到此错误Traceback (most recent call last): File "&lt;stdin&gt;", line 1, in &lt;module&gt; File "c:\Python27x64\lib\site-packages\pandas\tools\merge.py", line 846, in concat return op.get_result() File "c:\Python27x64\lib\site-packages\pandas\tools\merge.py", line 1031, in get_result indexers[ax] = obj_labels.reindex(new_labels)[1] File "c:\Python27x64\lib\site-packages\pandas\indexes\multi.py", line 1422, in reindex raise Exception("cannot handle a non-unique multi-index!") Exception: cannot handle a non-unique multi-index!
    【解决方案2】:

    你可以的

    df_master['unique1'] = df_reference1['unique1']
    

    这将创建新行“unique1”。注意你的索引!

    【讨论】:

    • 我在常用列上设置索引,例如出现在所有 CSV 文件中的所有列。这个输出实际上看起来不错,但是例如,如果最大的 CSV 文件有 20M 行,那么在输出文件中,它有大约 10K - 但是大多数行不匹配这是可以理解的。但我只是手动签出 - 不确定结果是否有意义......将首先尝试对文件进行排序
    猜你喜欢
    • 2019-07-21
    • 2021-10-04
    • 2019-08-09
    • 2017-08-29
    • 2021-12-17
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多