【问题标题】:Merging a number of csv files to form one csv file in Python在 Python 中合并多个 csv 文件以形成一个 csv 文件
【发布时间】:2020-09-01 14:40:50
【问题描述】:

我正在尝试将多个 csv 文件合并在一起。它们都有一些共同点,分别是:

CU_NUMBER   CYCLE_DATE  JOIN_NUMBER CU_NAME PhysicalAddressLine1    PhysicalAddressCity PhysicalAddressStateCode

这些列的右侧将是所有 csv 文件中感兴趣的各个列。现在,其中一些 csv 文件将具有我仍想合并的不同感兴趣的列。此外,某些文件可能没有相同的 CU_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 中使用哪些。是否有重复的列(除了前 7 个),您想如何处理它们?你都尝试了些什么。你能用Dataframe.merge来解决你的问题吗?
  • @Joooeey 当然让我澄清一下。
  • @Joooeey 我试图添加一些澄清,但我不确定我是否表达得足够好。
  • 在黑暗中拍摄的总左场:鉴于它是一个 KeyError,您确定源数据中的某个 CU_NAME 字段在列名中没有杂散空间吗?

标签: python pandas csv merge


【解决方案1】:

您看到的错误是因为您的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

【讨论】:

  • 这很奇怪,因为我正在查看两个数据帧中的 .head() 并且它们都包含 CU_NAME。
  • 使用您的方法,我可以看到我们可以将公共列合并在一起,这很好。但是我们如何合并其余不常见但您仍希望将它们加入的列?
  • @Snorrlaxxx 1) 在您上面的代码中(到目前为止我所拥有的),df_concat1 是调用 concat() 的结果,似乎没有包含该列。 2)on= 只定义了合并或连接索引。生成的 df_m 还包含来自所有合并数据帧的所有 非常见 列。
猜你喜欢
  • 2019-10-11
  • 2019-05-07
  • 2021-08-17
  • 2022-01-20
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-17
相关资源
最近更新 更多