【问题标题】:How to consolidate multiple CSV files with similar and different columns into 1 using Python and Pandas?如何使用 Python 和 Pandas 将具有相似和不同列的多个 CSV 文件合并为 1?
【发布时间】:2021-01-20 06:34:36
【问题描述】:

我有 12 个 CSV 文件,我正在尝试将它们合并为一个 CSV 文件。在这 12 个文件中,每一个文件中都有一列 SendIDSendID 是唯一的,不应在最终合并的 CSV 文件中重复。例如,我的 12 个 CSV 文件中有四个具有这些列。

(File 1: A,B,C,D,E), (File 2: A,C,F,H,K), (File 3: A,B,D,H,L), (File 4: A,D,H,N,Q)

因此,A 列存在于每个 CSV 文件中,并作为唯一的标识列或主键,不应在最终的 CSV 文件中重复。在某些情况下,同一列可能会出现在多个 CSV 文件中,如果这些列通过相同的SendID 连接(或上例中列出的 A 列),则这些列在每个文件中将带有相同的值。

这些文件还可能具有仅存在于单个 CSV 文件中且不存在于任何其他文件中的不同列,同样,此列将附加到 SendID 主键列上的最终聚合行。列中也可能有一些行,它们不会为许多 CSV 文件中的每条SendID 记录携带一个值。因此,基于唯一 SendID 的一行可能有 K 列的值,但 Q 列没有值。在这种情况下,该记录的 Q 列的值为 NULL 或空。

如何使用 Python 和 Pandas 将这 12 个 CSV 文件转换为一个最终的 CSV 文件,其中不包含重复的 SendID 记录?同时还能够将不同文件中的所有不同列附加到 SendID 主键,为每个唯一的 SendID 记录形成一个聚合行,当然不会创建可能出现在多个 CSV 文件中的同一列的重复项。我提前道歉,因为我知道这有点冗长,但我对 python 还是很陌生,并且正在努力学习。

【问题讨论】:

    标签: python python-3.x pandas dataframe csv


    【解决方案1】:

    假设你有这个数据框

    import pandas as pd
    
    df1 = pd.DataFrame([{'A':'1', 'B':'2'}])
    df2 = pd.DataFrame([{'A':'1', 'C':'3'}, {'A':'2', 'C':'4'}])
    

    现在,如果你想在 A 列即 SendID 的基础上合并这两个,你可以这样做

    df1.merge(df2, on='A', how='outer').drop_duplicates()
    

    这将导致合并的文件像;

    因此,它不会包含重复记录。此外,附加具有相同主键的各个列,形成唯一记录。

    【讨论】:

      【解决方案2】:
      df1 = pd.DataFrame(columns=list('ABCDE'))
      df2 = pd.DataFrame(columns=list('ACFHK'))
      df3 = pd.DataFrame(columns=list('ABDHL'))
      df4 = pd.DataFrame(columns=list('ADHNQ'))
      
      
      df_list = [df1, df2, df3, df4]
      # rename every column with subfix _1, _2, _3, _4, except the uniqueID row 'A'
      for i, df in enumerate(df_list):
          subfix = i+1
          df.columns = ['A'] + (df.columns[1:] + '_%s' % subfix).tolist()
      
      # outer merge every df, on uniqueID row 'A'
      dfn = df_list[0]
      for df in df_list[1:]:
          dfn = pd.merge(dfn, df, on='A', how='outer')
      
      
      # find the same column name dict
      obj_col = pd.Series(dfn.columns).to_frame()
      obj_col['col'] = obj_col[0].str.rsplit('_', 1).str[0]
      
      # remove the uniqueID row
      cond = obj_col['col'] == 'A'
      obj_col = obj_col[~cond]
      obj_col = obj_col.groupby('col')[0].agg(list)
      col_dict = obj_col.to_dict()
      col_dict
      
      # {'B': ['B_1', 'B_3'],
      #  'C': ['C_1', 'C_2'],
      #  'D': ['D_1', 'D_3', 'D_4'],
      #  'E': ['E_1'],
      #  'F': ['F_2'],
      #  'H': ['H_2', 'H_3', 'H_4'],
      #  'K': ['K_2'],
      #  'L': ['L_3'],
      #  'N': ['N_4'],
      #  'Q': ['Q_4']}
      
      # combine the same column's content with combine_first
      for col, colums in col_dict.items():
          dfn[col] = dfn[colums[0]]
          for i in colums[1:]:
              dfn[col] = dfn[col].combine_first(dfn[i])
      
      # result
      cols = ['A'] + list(col_dict.keys())
      result = dfn[cols].copy()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-04
        • 1970-01-01
        • 2021-09-24
        • 2021-12-17
        • 2021-04-28
        • 2017-01-11
        相关资源
        最近更新 更多