在Python中合并多个csv文件以形成一个csv文件

在Python中合并多个csv文件以形成一个csv文件,python,pandas,csv,merge,Python,Pandas,Csv,Merge,我正在尝试将多个csv文件合并在一起。它们都有几个共同的列,它们是: CU_NUMBER CYCLE_DATE JOIN_NUMBER CU_NAME PhysicalAddressLine1 PhysicalAddressCity PhysicalAddressStateCode 在这些列的右边是所有csv文件中感兴趣的各个列。现在,其中一些csv文件将有不同的感兴趣的列,我仍然希望合并这些列。此外,某些文件可能不具有相同的CU_编号、CU_名称、PhysicalAddressL

我正在尝试将多个csv文件合并在一起。它们都有几个共同的列,它们是:

CU_NUMBER   CYCLE_DATE  JOIN_NUMBER CU_NAME PhysicalAddressLine1    PhysicalAddressCity PhysicalAddressStateCode
在这些列的右边是所有csv文件中感兴趣的各个列。现在,其中一些csv文件将有不同的感兴趣的列,我仍然希望合并这些列。此外,某些文件可能不具有相同的CU_编号、CU_名称、PhysicalAddressLine1、PhysicalAddressCity、PhysicalAddressStateCode

下面是我想做的一个例子。假设我有一个数据帧

和另一个数据帧

合并后,我希望有如下内容:

df_concat1 = pd.concat([ df13[['CU_NUMBER','CYCLE_DATE',
                                      'JOIN_NUMBER',
                                      'PhysicalAddressLine1','PhysicalAddressCity', 
                               'PhysicalAddressStateCode','(CECL) Allowance for Credit Losses on Loans and Leases']] 
                      ], axis = 0)
new_df1 = df12.merge(df_concat1, how='left', on=['CU_NUMBER','CYCLE_DATE', 'JOIN_NUMBER',
                                                'CU_NAME', 'PhysicalAddressLine1',
                                                'PhysicalAddressCity', 'PhysicalAddressStateCode'])
棘手的是,所有csv文件都有不同的列,我想看看是否有一种好方法可以以这种方式合并所有这些列,而不必手动指定我想要的每一列。我总共有20个csv文件,我想以这种方式合并成一个

到目前为止,我所拥有的:

我试过这样的方法:

df_concat1 = pd.concat([ df13[['CU_NUMBER','CYCLE_DATE',
                                      'JOIN_NUMBER',
                                      'PhysicalAddressLine1','PhysicalAddressCity', 
                               'PhysicalAddressStateCode','(CECL) Allowance for Credit Losses on Loans and Leases']] 
                      ], axis = 0)
new_df1 = df12.merge(df_concat1, how='left', on=['CU_NUMBER','CYCLE_DATE', 'JOIN_NUMBER',
                                                'CU_NAME', 'PhysicalAddressLine1',
                                                'PhysicalAddressCity', 'PhysicalAddressStateCode'])
但我得到了这个错误:

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-13-c2b139ce1777> in <module>
      6 new_df1 = df12.merge(df_concat1, how='left', on=['CU_NUMBER','CYCLE_DATE', 'JOIN_NUMBER',
      7                                                 'CU_NAME', 'PhysicalAddressLine1',
----> 8                                                 'PhysicalAddressCity', 'PhysicalAddressStateCode'])

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py in merge(self, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator, validate)
   7295             copy=copy,
   7296             indicator=indicator,
-> 7297             validate=validate,
   7298         )
   7299 

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\reshape\merge.py in merge(left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator, validate)
     84         copy=copy,
     85         indicator=indicator,
---> 86         validate=validate,
     87     )
     88     return op.get_result()

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\reshape\merge.py in __init__(self, left, right, how, on, left_on, right_on, axis, left_index, right_index, sort, suffixes, copy, indicator, validate)
    625             self.right_join_keys,
    626             self.join_names,
--> 627         ) = self._get_merge_keys()
    628 
    629         # validate the merge keys dtypes. We may need to coerce

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\reshape\merge.py in _get_merge_keys(self)
    981                     if not is_rkey(rk):
    982                         if rk is not None:
--> 983                             right_keys.append(right._get_label_or_level_values(rk))
    984                         else:
    985                             # work-around for merge_asof(right_index=True)

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py in _get_label_or_level_values(self, key, axis)
   1690             values = self.axes[axis].get_level_values(key)._values
   1691         else:
-> 1692             raise KeyError(key)
   1693 
   1694         # Check for duplicates

KeyError: 'CU_NAME'

我不知道为什么会出现这个错误。我想要的是将所有感兴趣的列合并到一个文件中,如果有感兴趣的列是该文件唯一的,那么它将只是一个新列。如果有重复的列,那么如果有意义的话,我只想添加新行。

您看到的错误是因为df_concat1不包含名为“CU_name”的列或索引。合并时,通过on=传递的所有名称必须存在于两个数据帧中

所以,是的,DataFrame.merge是您的朋友,DataFrame.concat在这里没有用处。如果确定每个数据帧中都存在公共列,则可以在循环中合并:

common_columns = [...]
df_m, *df_others = my_dataframes
for df in df_others:
    # using 'outer' makes sure we keep all rows from all files 
    df_m = df_m.merge(df, how='outer', on=common_columns)

# do work with df_m

首先,请告诉我们您希望通过什么逻辑合并感兴趣的列?您希望在新DF中使用哪些。除了前7列之外,还有重复的列吗?您希望如何处理它们?到目前为止你都试了些什么。你能用Dataframe.merge来解决你的问题吗?@Joooeey当然让我澄清一下。@Joooeey我试图补充一些澄清,但我不确定我是否表达得足够好。黑暗中的左外野投篮总数:考虑到这是一个关键错误,您确定源数据中的某个CU_名称字段在列名中没有多余的空格吗?这很奇怪,因为我正在查看两个数据帧中的.head,它们都包含CU_名称。使用您的方法,我可以看到我们可以将公共列合并在一起,这很好。但是,我们如何合并其他不常见但您仍然希望加入的列呢?@snorlaxxx 1在您的代码中,我已经介绍了到目前为止,df_concat1是对concat的一些调用的结果,似乎不包含该列。2 on=仅定义合并或联接索引。结果df_m还包含来自所有合并数据帧的所有非公共列。